Shiro快速入门之三

一、前言

接Shiro快速入门之二,上篇侧重于介绍认证,这篇介绍一下Shiro的授权,先初始化5张表的数据。

注:创建三条权限记录,一个admin角色分配查询和添加用户权限,一个账户qingcai18036授予管理员角色。

二、代码

1、MyShiroRealm.java

Shiro快速入门之三_第1张图片

注:MyShiroRealm增加授权接口,实现授权方法,进入该方法时肯定是通过了认证,先从参数中获取用户对象(这里对应认证接口SimpleAuthenticationInfo设置principal参数值),然后遍历用户对象中所有角色以及所权限,将该用户的所有角色和权限设置到SimpleAuthorizationInfo对象中。

2、ShiroConfig.java

注:增加AuthorizationAttributeSourceAdvisor构建,开启shiro Aop支持,即在Controller的方法中可以用类似注释@RequiresPermissions("user:add")来配置每个接口的访问权限。

3、UserController.java

Shiro快速入门之三_第2张图片

注:在需要授权的接口加上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快速入门之三_第3张图片

三、权限注解

shiro权限有5个注解,如果一个类或方法上有多个注解,按下列次序进行处理,如果通过的会继续检查后面,否则返回。

  • RequiresRoles:可作用于Controller或方法上,多个角色是And关系,必须同时具备。

  • RequiresPermissions:与RequiresRoles类似,用得比较多。

  • RequiresAuthentication:当前Subject必须在当前session中已经过认证。

  • RequiresUser:当前Subject必须是应用的用户,才能访问或调用被该注解标注的类

  • RequiresGuest:不需要经过认证或者在原先的session中存在记录。

四、权限注解源代码剖析

ShiroConfig.配置AuthorizationAttributeSourceAdvisor会调用

AopAllianceAnnotationsAuthorizingMethodInterceptor注册拦截器

Shiro快速入门之三_第4张图片

然后调用具体方法,如果注解上有@RequiresPermissions("user:add"),会调用PermissionAnnotationHandler类的通过suject对象检测是否有注解上的值

Shiro快速入门之三_第5张图片

你可能感兴趣的:(Java技术,java)