一、前言
接Shiro快速入门之二,上篇侧重于介绍认证,这篇介绍一下Shiro的授权,先初始化5张表的数据。
注:创建三条权限记录,一个admin角色分配查询和添加用户权限,一个账户qingcai18036授予管理员角色。
二、代码
1、MyShiroRealm.java
注:MyShiroRealm增加授权接口,实现授权方法,进入该方法时肯定是通过了认证,先从参数中获取用户对象(这里对应认证接口SimpleAuthenticationInfo设置principal参数值),然后遍历用户对象中所有角色以及所权限,将该用户的所有角色和权限设置到SimpleAuthorizationInfo对象中。
2、ShiroConfig.java
注:增加AuthorizationAttributeSourceAdvisor构建,开启shiro Aop支持,即在Controller的方法中可以用类似注释@RequiresPermissions("user:add")来配置每个接口的访问权限。
3、UserController.java
注:在需要授权的接口加上RequiresPermissions("权限key")来设置,这里我用qingcai18036登录后(初始化数据中qingcai18036账号配置了角色admin,admin角色配置了权限user:view和user:add),然后访问http://localhost:8080/userAdd、或http://localhost:8080/userList?name=qingcai18036可以正访问,而访问http://localhost:8080/userDel后台会抛出org.apache.shiro.authz.AuthorizationException运行时异常。但返回数据显示的是500错误,你可以配置跳转到403页面,在ShiroConfig.java加上如下下配置
三、权限注解
shiro权限有5个注解,如果一个类或方法上有多个注解,按下列次序进行处理,如果通过的会继续检查后面,否则返回。
-
RequiresRoles:可作用于Controller或方法上,多个角色是And关系,必须同时具备。
-
RequiresPermissions:与RequiresRoles类似,用得比较多。
-
RequiresAuthentication:当前Subject必须在当前session中已经过认证。
-
RequiresUser:当前Subject必须是应用的用户,才能访问或调用被该注解标注的类
-
RequiresGuest:不需要经过认证或者在原先的session中存在记录。
四、权限注解源代码剖析
ShiroConfig.配置AuthorizationAttributeSourceAdvisor会调用
AopAllianceAnnotationsAuthorizingMethodInterceptor注册拦截器
然后调用具体方法,如果注解上有@RequiresPermissions("user:add"),会调用PermissionAnnotationHandler类的通过suject对象检测是否有注解上的值