🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
**1. `@Secured`** ```java /** * 1. @Secured注解参数必须以ROLE_为前缀。 * 2. 当前用户有role001,或管理员002 权限时才能访问/account/list05。 * 3. 使用@Secured注解需要在启动类上标记注解@EnableGlobalMethodSecurity(securedEnabled=true), * 并将securedEnabled设置为true */ @RequestMapping("/account/list05") @Secured({"ROLE_role001", "ROLE_管理员002"}) public String list05() { System.out.println("list05"); return "list05"; } ``` **2. `@PreAuthorize`** ```java /** * 1. @PreAuthorize注解适合进入方法前的权限验证,它可以将登录用户的角色/权限参数传递到hasxxx方法中, * hasAuthority、hasAnyAuthority、hasRole、hasAnyRole、hasPermission。 * 2. 当前用户有role001,或管理员002 权限时才能访问/account/list06。 * 3. 使用@PreAuthorize注解需要在启动类上标记注解@EnableGlobalMethodSecurity(prePostEnabled = true), * 并将prePostEnabled设置为true */ @RequestMapping("/account/list06") @PreAuthorize("hasAnyRole('ROLE_role001', 'ROLE_管理员002')") public String list06() { System.out.println("list06"); return "list06"; } ``` **3. `@PostAuthorize`** ```java /** * 1. @PostAuthorize注解在方法list07执行后再进行权限验证,适合验证带有返回值的权限。 * 2. 当前用户没有admin001和管理员002 权限时方法会被执行,但是到前端时会显示403页面。 * 3. 使用@PreAuthorize注解需要在启动类上标记注解@EnableGlobalMethodSecurity(prePostEnabled = true), * 并将prePostEnabled设置为true */ @RequestMapping("/account/list07") @PostAuthorize("hasAnyAuthority('admin001', '管理员002')") public String list07() { System.out.println("list07"); return "list07"; } ``` **4. `@PostFilter`** ```java /** * 1. @PostFilter注解在权限验证之后对数据进行过滤,传递到前端的数据只有用户名是 lisi 的数据。 * 2. 表达式中的 filterObject 引用的是list08方法返回值 List 中的某一个元素。 * 3. 使用@PostFilter注解需要在启动类上标记注解@EnableGlobalMethodSecurity(prePostEnabled = true), * 并将prePostEnabled设置为true */ @RequestMapping("/account/list08") @PreAuthorize("hasRole('ROLE_role001')") @PostFilter("filterObject.username == 'lisi'") public List<Account> list08() { List<Account> list = new ArrayList<>(1); list.add(Account.builder().username("zhangsan").build()); list.add(Account.builder().username("lisi").build()); System.out.println(list); return list; } ``` **5. `@PreFilter`** ```java /** * 1. @PreFilter注解在权限验证后,对方法参数list进行过滤。 * 2. 当前端传递多条数据时,进入到方法里面的数据不会有username=lisi的数据。 * 3. 使用@PreFilter注解需要在启动类上标记注解@EnableGlobalMethodSecurity(prePostEnabled = true), * 并将prePostEnabled设置为true */ @RequestMapping("/account/list09") @PreAuthorize("hasRole('ROLE_role001')") @PreFilter(value = "filterObject.username !='lisi'") public List<Account> list09(@RequestBody List<Account> list) { System.out.println(list); return list; } ``` **** 更多注解表达式参考官网:https://docs.spring.io/spring-security/site/docs/5.3.4.RELEASE/reference/html5/#el-access