4.用户授权
授权时序图

用户授权流程

1.在权限和角色校验中,主要以Subject.isPermitted()或者Subject.hasRoles()开始,以下为Subject接口。

2.进入DelegatingSubject类中的isPermitted(String permission)或者hasRole(String roleIdentifier),执行this.securityManager.hasRole(this.getPrincipals(), roleIdentifier),或者this.securityManager.isPermitted(this.getPrincipals(), permission)方法。


3.AuthorizingSecurityManager为SecurityManager的子类,进入AuthorizingSecurityManager类中的isPermitted()或者hasRole()方法,执行this.authorizer.isPermitted(principals, permissionString);其中authorizer为ModularRealmAuthorzier的实例。


4.进入ModularRealmAuthorzier中的isPermitted(PrincipalCollection principals, String permission)方法后,先获取到所有的realm,进入判断,判断realm是不是Authorizer或者Authorizer子类的实例,不是的话,进行循环,获取到下一个realm,若是则进行下一个判断,执行isPermitted(principals,permission)方法进行权限校验,用户存在该权限,循环结束,返回true,
用户不存在该权限,执行循环获取下一个realm。

5.方法进入AuthorizingRealm中的isPermitted(principals,string)方法,这里对接口权限进行了解析,因为在给用户授权时,权限有两种类型,分别为Permission和String,为了更好的比较,这里将String类型解析成Permission类型。执行getAuthorizationInfo()方法。

注意:hasRole()方法并没有进行解析过程,因为给用户赋予角色时,只有String类型,所有不需要解析。

默认解析器WildCardPermissionResolver。

6.进入getAuthorizationInfo()方法,执行doGetAuthorizationInfo()方法,获取用户的权限信息。

7.doGetAuthorizationInfo()是一个抽象方法,自定义realm继承了AuthorizingRealm,并对doGetAuthorizationInfo()进行了重写,该方法主要就是对用户授权的过程。这里从数据库中获取值并进行授权。

8 权限和角色校验
8.1 下面进行权限校验,获取到返回值后,在isPermitted()方法中会执行getPermissions(info)方法,这是对返回值info进行解析的方法。

进入getPermissions(info)方法,对info进行解析后,添加至Set<Permission>集合中。

返回至isPermitted()方法中,执行perm.implies(permission)方法进行比较,perm为用户的权限,permission为接口的权限

8.2下面进行角色校验,先判断info是否为空,info中的角色信息是否为空,判断用户角色和接口角色是否有交集,info.getRoles()为用户权限,roleIdentifier为接口权限。

8.3 角色和权限判断完毕后返回值第4步。

浙公网安备 33010602011771号