@Secured
方法级别的权限认证,只有被该注解指定的角色才能访问该方法
使用该注解需要开启注解功能,在配置类或者启动类上添加
@EnableGlobalMethodSecurity(securedEnabled=true)
在controller方法上添加@Secured注解
@GetMapping("update")
@Secured({"ROLE_salesman","ROLE_manager"}) //设置只有这两种角色才能访问这个方法
public String update() {
return "hello, update";
}
此时如果不是这两个角色其中之一访问请求将被拒绝
@PreAuthorize
进入方法前的权限验证,同时也支持表达式的访问控制
要想使用该注解需要在@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";
}
如果不能同时满足这两个条件,那么这个方法将不能访问
@PostAuthorize
同上面的注解一样,要开启此注解的功能需要在 @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,这说明该注解是在方法执行之后进行的权限验证
@PostFilter
在权限验证过后对数据进行过滤
@GetMapping("getAll")
@PreAuthorize("hasRole('salesman')")
@PostFilter("filterObject.username == 'admin1'") //权限验证之后对数据进行过滤 留下用户名是 admin1 的数据
public List<Users> getAllUser(){
ArrayList<Users> list = new ArrayList<>();
list.add(new Users(1,"admin1","6666"));
list.add(new Users(2,"admin2","888"));
return list;
}
访问该请求可发现只返回了admin1,admin2并没有显示出来而是被过滤掉了
@PreFilter
进入控制器之前对数据进行过滤