spring 如何对一个控制器类同时使用基于方法和基于类的授权?

fhity93d  于 2023-02-07  发布在  Spring
关注(0)|答案(1)|浏览(115)

我想在我的项目中包含Spring Security Basic Authentication。我想对一个控制器类同时进行基于方法和基于类的授权。这样老师就可以访问我的控制器类中的所有端点。但是学生只能访问其中的一些端点。我该如何提供这一点呢?
我在我的类上面加了@PreAuthorize("hasRole('TEACHER')"),在一些方法上面加了@PreAuthorize("hasRole('STUDENT')"),但是我不能做我想做的事情,你认为我应该怎么做?

igsr9ssn

igsr9ssn1#

正如@dur所建议的,没有一种方法可以“扩展”Controller方法的授权角色(至少我不知道)。不过,有一种很好的方法可以实现您想要的功能。假设您有一个名为StudiesController的控制器:

@RestController
@PreAuthorize("hasRole('TEACHER')") //annotating the controller class with PreAuthorize will provide "default" required acccess for all of the controller's methods
public class StudiesController {

    @PreAuthorize("hasAnyRole('STUDENT', 'TEACHER')")  //both students AND teachers have to to be able to access the study schedule. hence, we override the "default" required access to also allow students to access this method
    @GetMapping("/schedule")
    public Map<String, String> getSchedule() {
        //some code
    }
    
    @GetMapping("/grades/{studentId}")
    public Map<String, Integer> getGradesOfStudent(@PathVariable Integer studentId) {   //only teachers have to be able to access a student's grades, so we do not override the "default" access level
       //some code
    }

}

基本上,默认情况下,每个方法都只能由教师访问。任何你想让其他角色访问的方法,你可以用@PreAuthorize注解,并使用hasAnyRole方法列出允许的角色。不过,这确实导致你必须为这样的方法编写'TEACHER'
另外,不要忘记将@EnableMethodSecurity添加到SecurityConfig类中以启用@PreAuthorize注解

相关问题