shiro 鉴权代码流程

shiro 鉴权代码流程

前提条件

AuthorizingRealm的自定义子类的实现,主要重写鉴权方法代码

/**
  *可以重写该方法,将特定用户跳过鉴权认证,返回true即可
 */
@Override
public boolean isPermitted(PrincipalCollection principals, String permission) {
    return super.isPermitted(principals, permission);
}  


/**
 * (验证权限时调用)
 * principals 用户信息
 * 设置授权信息
 */
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    SysUserEntity user = (SysUserEntity)principals.getPrimaryPrincipal();
    String userId = user.getId();

    //用户权限列表
    Set<String> permsSet = shiroService.getUserPermissions(userId);

    SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
    info.setStringPermissions(permsSet);
    return info;
}

具体流程 :

当前端访问controller方法时,如果方法上有 @RequiresPermissions 注解,则代表调用该方法前会被拦截器拦截,校验改用户权限

@SysLog("删除定时任务")
@PostMapping("/delete")
@RequiresPermissions("sys:schedule:delete")
public R delete(@RequestBody String[] jobIds){
   scheduleJobService.deleteBatch(jobIds);
   
   return R.ok();
}

org.apache.shiro.authz.aop.AnnotationsAuthorizingMethodInterceptor#assertAuthorized (拦截器)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存失败,源站可能有防盗链机制,建议将图片保存下来直接上传下上传(iMon5WxSfIE1-1616057892944)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210318164340792.png)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210318164340792.png)]

org.apache.shiro.authz.aop.AuthorizingAnnotationMethodInterceptor#assertAuthorized

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sL7x4QhW-1616057892945)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210318164406531.png)]

org.apache.shiro.authz.aop.PermissionAnnotationHandler#assertAuthorized

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VSO7LRaL-1616057892946)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210318164512783.png)]

org.apache.shiro.subject.support.DelegatingSubject#checkPermission

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EBIN9lRw-1616057892948)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210318164608860.png)]

org.apache.shiro.mgt.AuthorizingSecurityManager#checkPermission

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LIucmDYA-1616057892949)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210318164623652.png)]

org.apache.shiro.authz.ModularRealmAuthorizer#checkPermission

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A3UQUUds-1616057892950)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210318164719412.png)]

org.apache.shiro.authz.ModularRealmAuthorizer#isPermitted

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mwCaXC5D-1616057892950)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210318164803506.png)]

这一步就会调用到我们最开始重写的方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XarXwqLd-1616057892951)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210318164846320.png)]

重写方法如下,如果是管理员用户,则直接返回true,不做鉴权(此处逻辑为重写的业务逻辑),如果非管理员,则调用父类的isPermitted方法[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-psC5mTdd-1616057892951)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210318164938414.png)]

org.apache.shiro.realm.AuthorizingRealm#isPermitted (父类方法)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NGAIzLpX-1616057892952)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210318165047996.png)]

org.apache.shiro.realm.AuthorizingRealm#getAuthorizationInfo 调用最开始realm的重写鉴权方法,进行权限查看

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E5RIHIyq-1616057892952)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210318165330015.png)]

重写方法(查看该用户的权限列表)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-24klh72Q-1616057892953)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210318165506723.png)]

将改请求与权限列表进行比对,验证是否有权限进行访问 org.apache.shiro.realm.AuthorizingRealm#isPermitted

返回true则代表有权限

]

将改请求与权限列表进行比对,验证是否有权限进行访问 org.apache.shiro.realm.AuthorizingRealm#isPermitted

返回true则代表有权限

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oRHkJa2H-1616057892953)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210318165629338.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值