Loading... ## 前言 集成 Spring 后我们通过过滤器链来配置每个 URL 需要的权限,但当配置多了以后就会不方便,而且只支持 URL 级别的配置。 好在 Shiro 提供了相应的注解用于权限控制,此处使用了 Spring MVC 来测试Shiro注解,当然 Shiro 注解不仅仅可以在 web 环境使用,在独立的JavaSE 中也是可以用的,此处只是以 web 为例了。 <!--more--> ## 开启注解配置 首先我们需要在 **Spring Web** 的配置文件 `spring-web.xml` 中加入以下内容来开启 Shiro 的注解支持 : ```xml <aop:config proxy-target-class="true"/> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean> ``` ## 简单演示 接着我们就可以使用注解来配置权限: ```java @RestController public class AuthorizationController { @RequestMapping("/role1") @RequiresRoles("user") public String role1() { return "success"; } @RequestMapping("/role2") @RequiresRoles("admin") public String role2() { return "success2"; } } ``` 访问 `role1` 方法需要当前用户有 `user` 角色,`role2` 方法需要 `admin` 角色。 当验证失败时,会抛出 `UnauthorizedException` ,我们可以使用 Spring 的 ExceptionHandler 来进行异常处理: ```java @ExceptionHandler(UnauthorizedException.class) public String processUnauthorizedException(UnauthorizedException e) { return e.getMessage(); } ``` ## 更多注解 当然不止有 `@RequiresRoles` 用来验证角色,Shiro 还提供了以下注解: ### @RequiresAuthentication 验证用户是否登陆,等同于方法 subject.isAuthenticated() 。 ### @RequiresUser 验证用户是否被 **记忆**,即登陆成功或 `RememberMe` 状态。等同于方法 : `subject.isAuthenticated()` 与 `subject.isRemembered()`。 ### @RequiresGuest 仅未登录状态可访问,与 `@RequiresUser` 完全相反。 ### @RequiresPermissions 验证是否具备权限,可通过参数 `logical` 来配置验证策略: ```java // 拥有 admin 或 user 角色即可 @RequiresPermissions(logical = Logical.OR,value = {"admin", "user"}) // 需同时具备 admin 与 user 角色 @RequiresPermissions(logical = Logical.AND,value = {"admin", "user"}) ``` > RequiresRoles 同样可以配置验证策略。 ## 小结 我们可以通过注解配置来更方便的实现权限配置,且这些方法不仅可以配置在 Controller 层,还可以在 Service 层,DAO 层等,只不过需要通过 IOC 容器来获取对象才能使用。 本章代码地址 : https://github.com/zhaojun1998/Premission-Study/tree/master/Permission-Shiro-10/ 最后修改:2022 年 05 月 02 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请我喝杯咖啡吧。