一、前言
本文基于上一篇文章进行介绍【Shiro】SimpleAuthenticationInfo如何验证password。
二、自定义的ShiroRealm类

经过上一篇文章的探求,这回直接找准doGetAuthorizationInfo方法;我们回过头看下ShiroRealm,它继承了AuthorizingRealm

三、AuthorizingRealm类
进到了AuthorizingRealm里面,通过find查找doGetAuthorizationInfo可以定位到在getAuthorizationInfo(PrincipalCollection principals)方法

1、PrincipalCollection
在getAuthorizationInfo(PrincipalCollection principals)方法中,这里有PrincipalCollection对象,这个是从哪传来的我并没有细究(大概是在底层传过来的)。
但在写【Shiro】SimpleAuthenticationInfo如何验证password的时候,留意到在doGetAuthenticationInfo认证的时候,new SimpleAuthenticationInfo这个对象,它就赋值了PrincipalCollection对象,最后根据功能,类,大但的猜测,AuthorizingRealm类中getAuthorizationInfo(PrincipalCollection principals)的PrincipalCollection principals就是SimpleAuthenticationInfo创建的对象。


2、AuthorizingRealm类中蓝色框部分
将AuthorizingRealm和AuthenticatingRealm放在一起看,可以发现,AuthorizingRealm的getAuthorizationInfo中大红框这段与AuthenticatingRealm的getAuthenticationInfo中大蓝框这段大同小异。
这段代码目的: 都是查看是否存在缓存,打算从缓存中查找用户的认证信息或授权信息。

我们在看下里面的小红框和小蓝框,分别点进去看,可以发现,最后有值的返回都是PrincipalCollection类的对象principals。

然后利用principals去缓存Cache中,找出相应的AuthenticationInfo(认证信息)或AuthorizationInfo(授权信息)
3、doGetAuthorizationInfo(principals)的info给谁用?
这个部分就是ShiroRealm中@Override的授权,最后返回授权信息info。
这里有个疑惑:这个info被return出去了,到底给谁用了?
我们看下编程式的授权方式,主要使用了Shiro中的Subject对象。
Subject subject = UserUtils.getSubject();
subject.isAuthenticated(); // 是否身份验证授权通过
subject.isPermitted(permission); // 验证权限字符串
subject.isPermittedAll(permissions); // 验证权限字符串全部通过
subject.hasRole(roleIdentifier); // 验证是否有角色权限
这里有调用几个方法,我们挑subject.isPermitted(permission);进去Subject接口看看。

在进去看它的实现类DelegatingSubject,看其中securityManager.isPermitted(getPrincipals(), permission)的方法。(出现了securityManager)

在进到AuthorizingRealm看isPermitted方法,可以看到最后用到了getAuthorizationInfo(principals)方法返回info。

四、总结图




















