@Secured
判断是否具有角色,另外需要注意的是这里匹配的字符串是角色 ,需要带有前缀ROLE_
用法示例:
使用
@EnableGlobalMethodSecurity(securedEnabled=true)开启注解功能 ```java @SpringBootApplication @MapperScan @EnableGlobalMethodSecurity(securedEnabled = true) // 开启secured注解 public class SpringSecurity01Application {public static void main(String[] args) {
SpringApplication.run(SpringSecurity01Application.class, args);
}
}
2.在对应的controller上使用@Secured注解配置需要的角色```java@GetMapping("/secured")@Secured({"ROLE_admin", "ROLE_test"}) // 配置的是角色名,需要带有 ROLE_ 前缀public String testSecured() {return "hello secured";}
@PreAuthorize
进入方法前的权限验证,可以将登陆用户的 authority/roles/permissions 参数传到方法中。
用法示例:
使用
@EnableGlobalMethodSecurity(prePostEnabled = true)开启注解功能 ```java @SpringBootApplication @MapperScan @EnableGlobalMethodSecurity(prePostEnabled = true) // 开启prePost相关注解 public class SpringSecurity01Application {public static void main(String[] args) {
SpringApplication.run(SpringSecurity01Application.class, args);
}
}
2.在对应的controller上使用该注解```java@GetMapping("/preAuthorize")@PreAuthorize("hasRole('ROLE_admin')") // value为 spEL 表达式。可以使用的函数有:hasRole/hasAnyRole/hasAuthority/hasAnyAuthority/hasPermission/hasPermisson等public String testPreAuthorize() {return "hello preAuthorize";}
@PostAuthorize
在方法执行后再进行权限验证,适合验证带有返回值的权限。
用法示例:
使用
@EnableGlobalMethodSecurity(prePostEnabled = true)开启注解功能在对应的controller上使用该注解
@GetMapping("/postAuthorize")@PostAuthorize("hasRole('ROLE_test')") // 在方法执行之后才会校验权限。所以即使用户没有权限访问页面,该方法也会被执行。public String testPostAuthorized() {System.out.println("--------方法执行了");return "test postAuthorize";}
@PostFilter
权限验证之后对数据进行过滤。
用法示例:
@GetMapping("/getAllUser")@PostFilter("filterObject.username == 'test11'")public List<UserInfo> getAllUser() {List<UserInfo> userInfoList = new ArrayList<>();userInfoList.add(new UserInfo(1, "test11", "123"));userInfoList.add(new UserInfo(2, "test12", "456"));userInfoList.add(new UserInfo(3, "test13", "789"));return userInfoList;}
页面请求 /getAllUser 时,只会返回 test11这条信息。
@PreFilter
进入控制器之前对数据进行过滤。
用法示例:
@PostMapping("/addUser")@PreFilter("filterObject.userid % 2 == 0")public List<UserInfo> addUser(@RequestBody List<UserInfo> list) {list.forEach(userInfo -> System.out.println(userInfo));return list;}
当页面请求传入的报文为:
[{"userid":1,"username":"test11","password":"123"},{"userid":2,"username":"test12","password":"456"},{"userid":3,"username":"test12","password":"456"},{"userid":4,"username":"test12","password":"456"}]
后台controller的参数中只接收到 userid为2、4的信息:
[{"userid": 2,"username": "test12","password": "456"},{"userid": 4,"username": "test12","password": "456"}]
