方法级别的权限认证,只有被该注解指定的角色才能访问该方法
使用该注解需要开启注解功能,在配置类或者启动类上添加
@EnableGlobalMethodSecurity(securedEnabled=true)
在controller方法上添加@Secured注解
- @GetMapping("update")
- @Secured({"ROLE_salesman","ROLE_manager"}) //设置只有这两种角色才能访问这个方法
- public String update() {
- return "hello, update";
- }
此时如果不是这两个角色其中之一访问请求将被拒绝
进入方法前的权限验证,同时也支持表达式的访问控制
要想使用该注解需要在@EnableGlobalMethodSecurity注解上添加 prePostEnabled = true 属性
在controller中的方法上添加此注解
- @GetMapping("update")
- // @Secured({"ROLE_salesman","ROLE_manager"}) //设置只有这两种角色才能访问这个方法
- @PreAuthorize("hasAuthority('manager')")
- public String update() {
- return "hello, update";
- }
此时如果不具备manager权限的访问将会被拒绝
如果要求同时满足多个条件的可以这样编码
- @GetMapping("update")
- // @Secured({"ROLE_salesman","ROLE_manager"}) //设置只有这两种角色才能访问这个方法
- @PreAuthorize("hasAuthority('manager') and hasRole('salesman')") //只有同时满足是salesman角色并且具有manager权限的才能访问该方法
- public String update() {
- return "hello, update";
- }
如果不能同时满足这两个条件,那么这个方法将不能访问
同上面的注解一样,要开启此注解的功能需要在 @EnableGlobalMethodSecurity注解上添加 prePostEnabled = true 属性
@PostAuthorize注解的使用频率并不高,在方法执行之后再进行权限验证,适合验证带有返回值的权限。
在controller中的方法上添加上该注解
- @PostAuthorize("hasAuthority('admin')") //方法执行之后进行权限验证
- @GetMapping("testPostAu")
- public String testPostAu() {
- System.out.println("hello, PostAuthorize");
- return "hello, PostAuthorize";
- }
此时来一个没有admin权限的访问请求该方法,将会被拒绝访问,但是idea控制台会执行输出语句输出hello, PostAuthorize,这说明该注解是在方法执行之后进行的权限验证


在权限验证过后对数据进行过滤
- @GetMapping("getAll")
- @PreAuthorize("hasRole('salesman')")
- @PostFilter("filterObject.username == 'admin1'") //权限验证之后对数据进行过滤 留下用户名是 admin1 的数据
- public List
getAllUser(){ - ArrayList
list = new ArrayList<>(); - list.add(new Users(1,"admin1","6666"));
- list.add(new Users(2,"admin2","888"));
- return list;
- }
访问该请求可发现只返回了admin1,admin2并没有显示出来而是被过滤掉了

进入控制器之前对数据进行过滤