码迷,mamicode.com
首页 > 其他好文 > 详细

shiro源码分析-授权过程

时间:2020-07-15 23:23:21      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:arraylist   load   mission   sub   doget   源码   asp   细粒度   mic   

二。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源码分析-授权过程

标签:arraylist   load   mission   sub   doget   源码   asp   细粒度   mic   

原文地址:https://www.cnblogs.com/step-and-step/p/13307130.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!