集成 Spring 后我们通过过滤器链来配置每个 URL 需要的权限,但当配置多了以后就会不方便,而且只支持 URL 级别的配置。
好在 Shiro 提供了相应的注解用于权限控制,此处使用了 Spring MVC 来测试Shiro注解,当然 Shiro 注解不仅仅可以在 web 环境使用,在独立的JavaSE 中也是可以用的,此处只是以 web 为例了。
首先我们需要在    Spring Web
的配置文件    spring-web.xml
中加入以下内容来开启 Shiro 的注解支持 :  
<aop:config proxy-target-class="true"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    <property name="securityManager" ref="securityManager"/>
</bean>
    接着我们就可以使用注解来配置权限:
@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 来进行异常处理:  
@ExceptionHandler(UnauthorizedException.class)
public String processUnauthorizedException(UnauthorizedException e) {
    return e.getMessage();
}
    
当然不止有    @RequiresRoles
用来验证角色,Shiro 还提供了以下注解:  
验证用户是否登陆,等同于方法 subject.isAuthenticated() 。
验证用户是否被    记忆
,即登陆成功或    RememberMe
状态。等同于方法 :    subject.isAuthenticated()
与    subject.isRemembered()
。  
仅未登录状态可访问,与    @RequiresUser
完全相反。  
验证是否具备权限,可通过参数    logical
来配置验证策略:  
// 拥有 admin 或 user 角色即可
@RequiresPermissions(logical = Logical.OR,value = {"admin", "user"})
// 需同时具备 admin 与 user 角色
@RequiresPermissions(logical = Logical.AND,value = {"admin", "user"})
    RequiresRoles 同样可以配置验证策略。