授权流程
- shiro拦截到需要权限的url的时候,就传入需要的permission,进行subject.isPermitted(permission)的检查。
- DelegatingSubject代理类接收到permission后,调用自己的isPermitted方法进行判断。判断分为两步:hasPrincipals && securityManager.isPermitted(getPrincipals(),permission)。首先是判断用户的身份信息是否存在切有效,第二步是判断用户的凭证信息和用户所要请求的权限是否符合。
- AuthorizingSecurityManager调用this.authorizer.isPermitted(principals,permission)进行判断,返回一个布尔值。authorizer在AuthorizingSecurityManager的构造函数中就被new,就是ModularRealmAuthorizer。
- ModularRealmAuthorizer接收到参数后,遍历realm,进行权限判断。((Authorizer) realm).isPermitted(principals, permission)。
- 上面的isPermitted方法是定义在AuthorizingRealm中的,自定义的realm都要继承这个类,也就是说自定义的realm都有这个判断的方法。realm内部首先会拿着principals去获取到用户的权限信息AuthorizationInfo,然后对权限信息进行遍历查找,看看permission是否存在于info中,如果存在就返回true。
AuthorizationTest
传入权限标识符,返回一个布尔值,表示是否有这个权限。
|
|
DelegatingSubject
权限标识符传入后,进行两个判断,一个是当前是否存在这个身份信息,另外一个是这个用户是否有这个权限,两个都是true才返回true,权限认证通过
|
|
AuthorizingSecurityManager
调用ModularRealmAuthorizer中的权限判断方法
|
|
ModularRealmAuthorizer
遍历realm集合,只要有一个realm判断认证通过,就返回true,这边的realm可以是自己设置进去的。
AuthorizingRealm
这是realm内部进行权限查询的流程,要求的自定义的realm全部都要继承它。会把用户的身份信息传入进去,然后获取到用户的授权信息,AuthorizerInfo,然后遍历info中的权限信息,只要存在,就返回true。
|
|