shiro源码分析-授权过程

Posted step-and-step

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shiro源码分析-授权过程相关的知识,希望对你有一定的参考价值。

二。shiro的授权过程源码分析

1.shiro不管是基于url的粗粒度权限控制,还是基于方法的细粒度权限控制。每个请求,都会经过PathMatchingFilter类的preHandle方法来校验url。关于shiro的filter再将。

我们就从RolesAuthorizationFilter的isAccessAllowed()方法开始解读。因为该方法中调用了subject.hasAllRoles(roles)方法。事实上,所有的授权都是从subject的授权方法开始。

技术图片

 2.跟进去。发现授权跟认证一样,都是调用SecurityManager来执行。hasPrincipals()方法会返回true。因为你登录后token中的Principal信息,就会存在。这里就不会为空。

技术图片

 3.跟进去。进到AuthorizingSecurityManager的hasRole()方法。这里的this.authorizer就是shiro的授权器,它是个接口。默认实现是ModularRealmAuthorizer。

技术图片

 4.进入到ModularRealmAuthorizer的hasAllRoles()。这里所有的角色都匹配的话,就返回true。反之则返回false。

技术图片

 5.进入到进入到ModularRealmAuthorizer的hasRole()方法。这里的realm都是我们开发的realm。因为我们开发的realm继承AuthorizingRealm,AuthorizingRealm继承AuthenticatingRealm,而AuthenticatingRealm又实现了Authorizer接口。因此可以强转为Authorizer。

技术图片

 6.跟踪进去。因为realm继承了AuthorizingRealm。因此此时代码跳到AuthorizingRealm的hasRole()方法。getAuthorizationInfo()方法,就是获取授权信息。AuthorizationInfo里面就是授权信息。

技术图片

 7.继续进入到getAuthorizationInfo()方法。跟认证一样,首先从缓存中获取,缓存中获取不到,再调用realm去数据库获取。

技术图片

 

技术图片

 8.我们开发的realm里面重写了doGetAuthorizationInfo()方法。此时跳到我们写的realm里面。

技术图片
  @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        UserVO user = (UserVO) principals.getPrimaryPrincipal();

        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();

        Set<RoleVO> roles = roleService.listRoleByUserId(user.getUserId());

        List<Integer> roleIds = new ArrayList<>();
        for (RoleVO role : roles) {
            authorizationInfo.addRole(role.getRoleCode());
            roleIds.add(role.getRoleId());
        }


        if (!roleIds.isEmpty()) {
            Set<PermissionVO> permissions = permissionService.listPermissionByRoleIds(roleIds);

            Set<String> collect = permissions.parallelStream()
                    .map(PermissionVO::getPermissionCode)
                    .collect(Collectors.toSet());

            authorizationInfo.addStringPermissions(collect);
        }
        return authorizationInfo;
    }
View Code

 

以上是关于shiro源码分析-授权过程的主要内容,如果未能解决你的问题,请参考以下文章

shiro源码分析2

Shiro 登录认证源码详解

JAVA代码审计之Shiro反序列化漏洞分析

Shiro源码分析----认证流程

Shiro源码分析----认证流程

shiro源码篇 - shiro认证与授权,你值得拥有