一、前言
本文基于上一篇文章进行介绍【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。