当前位置: 首页 > 知识库问答 >
问题:

使用jwt进行身份验证如何验证http请求

金瑞
2023-03-14

我正在使用spring Boot编写web应用程序。它是基于jwt认证的,我有模型用户,老师,学生,课程。师生扩展用户

@Entity
public class User {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;
   private String username;
   @ManyToMany(fetch = FetchType.LAZY)
   @JoinTable(name = "user_roles",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id"))
   private Set<Role> roles = new HashSet<>();
   // Other fields and getters setters
}

@Entity
public class Course {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;   
   @ManyToOne
   @JoinColumn(name = "teacher_id", nullable = false)
   private Teacher teacher;

   @ManyToMany(mappedBy = "enrolledCourses")
   private Set<Student> students;
   // Other fields and getters setters
}

@Entity
public class Teacher extends User{
   @OneToMany(mappedBy = "teacher")
   private Set<Course> courses;
   // Other fields and getters setters
}


@Entity
public class Student extends User{
   @ManyToMany
   @JoinTable(
        name = "course_student",
        joinColumns = @JoinColumn(name = "student_id"),
        inverseJoinColumns = @JoinColumn(name = "course_id"))
   private Set<Course> enrolledCourses;
   // Other fields and getters setters
}

而且我也有课程Api,我实现了post,put,delete,update和这些方法必须只有那些用户谁是教师可用。我的课程Api如下所示

@RestController
@RequestMapping("/teachers")
@PreAuthorize("hasRole('TEACHER')")
public class TeacherCourseController {

   @GetMapping("/{teacherId}/courses")
   public Set<Course> getCourse(@PathVariable("teacherId") Teacher teacher){
    // code
   }
   @PostMapping("/{teacherId}/courses")
   public Course createCourse(
        @PathVariable("teacherId") Long teacherId,
        @ModelAttribute CourseDto courseDto){
   // code
   }
   @PutMapping("/{teacherId}/courses/{courseId}")
   @JsonView(Views.IdName.class)
   public Course updateCourse(
        @ModelAttribute CourseDto courseDto,
        @PathVariable("courseId") Course courseFromDb){
    // code
   }
   @DeleteMapping("/{teacherId}/courses/{courseId}")
   public void getCourse(@PathVariable("courseId") Course course) throws IOException {
    // code
   }
}

我的api url变得更糟,看起来像http://localhost:8080/teachers/{teacherId}/courses/{courseId}我如何检查是老师请求他的课程,而不是其他老师。谢谢

共有1个答案

方祺
2023-03-14

为什么不让课程成为顶级资源呢?您将有一个类似/courses{courseId}的路径。在handler方法中,您检查来自对请求进行身份验证的JWT令牌的sub声明。如果声明与授课教师的教师id不匹配,则返回403禁止响应。

尽管课程是由老师教授的,但它们应该是自己的顶级资源,因为学生可能会列出它们并注册。

 类似资料:
  • jwt不应该仅仅用于认证用户吗?我读到过可以在里面存储非敏感的东西,比如用户ID。将权限级别之类的东西存储在令牌中可以吗?这样我可以避免数据库调用。

  • 但请求呢?和是用户的属性,但应将它们发送到endpoint。如果我将资源发送到endpoint,则没有多大意义。 对此有没有办法,遵循JSONAPI并保持API的意义?

  • 我正在开发一个具有自己的身份验证和授权机制的REST应用程序。我想使用JSON Web Tokens进行身份验证。以下是有效且安全的实现吗? < li >将开发一个REST API来接受用户名和密码并进行认证。要使用的HTTP方法是POST,因此没有缓存。此外,在传输时还会有安全SSL < li >在认证时,将创建两个JWTs访问令牌和刷新令牌。刷新令牌将具有更长的有效期。这两个令牌都将写入coo

  • 问题内容: 我需要使用PostForm方法将代理与auth一起使用。如果我使用类似(简体)的内容: 我可以轻松做到,并且效果很好。但是现在,我正在编辑第三方程序包,并尝试将代理添加到现有代码中: 在我看来,它是行不通的,而且失败了。在此示例中,没有身份验证的代理可以正常工作。有人知道吗,在这种情况下我可以在auth中使用代理吗? 问题答案: 您正在尝试向响应中添加标头,这不是您发送到服务器的内容,

  • 假设我们有以下部分的web安全配置:

  • 我有一个节点项目 我试过的密码- 运行此命令时,当secret_password错误时,它会正确显示,但当它正确时,它只显示一个单词swagger,表示swagger。io链接。 我搜索了一下,但是没有得到任何关于这个的信息或者例子。我错过了什么吗?

  • 问题内容: 因此,我正在使用RESTeasy和Google App Engine开发REST Web服务。我的问题与GAE无关,但我提到它只是为了以防万一。碰巧的是,我自然需要保护自己的资源和我自己的用户(而不是Google的用户)。 REST Web服务的安全似乎是一个很有争议的主题,或者至少是一个非常“自由的”主题。REST对此没有施加任何标准。根据我在网络和文献上的研究,至少有3种方法适合我

  • 我正在尝试使用urllib3连接到网页。代码如下所示。 如果我们假设url是需要使用用户名和密码进行身份验证的某个网页,那么我是否使用正确的代码进行身份验证? 我使用urllib2做这件事很舒服,但使用urllib3做不到同样的事情。 非常感谢