[Shrio使用总结]-详解shiro配置文件

使用shrio就不得不对shiro的架构进行分析,笔者分析一个框架一般从它的配置文件入手,可以快速了解整个框架的大体结构。

详解securityManager配置:

<!-- shiro安全管理器  设置cacheManage,下列属性有实现CacheManagerAware接口的,都会自动注入缓存管理器-->  
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
    <property name="cacheManager" ref="cacheManager" /> 
    <property name="realm" ref="monitorRealm" />  
    <property name="sessionManager" ref="shiroSessionManager" />  
    <property name="rememberMeManager" ref="rememberMeManager"/>
</bean>  

以上配置是securityManager自动注入缓存管理器的经典模式。如:DefaultWebSecurityManager
通过property属性配置的ref引用,默认调用该对象的set方法进行注入。调用完成后会相应调用一个回调方法
详解shiroSessionManager管理器如何管理各个子管理器:(以注入session管理器为例)
1.1当session管理器注入时,回调:

public void setSessionManager(SessionManager sessionManager) {
    this.sessionManager = sessionManager;
    afterSessionManagerSet();
}

在after回调方法里,设置缓存管理器:

protected void afterSessionManagerSet() {
    applyCacheManagerToSessionManager();
}
protected void applyCacheManagerToSessionManager() {
    if (this.sessionManager instanceof CacheManagerAware) {
        ((CacheManagerAware) this.sessionManager).setCacheManager(getCacheManager());
    }
}

1.2当缓存管理器注入时,回调:
protected void afterCacheManagerSet() {
super.afterCacheManagerSet();
applyCacheManagerToSessionManager();
}

基本上,shiro框架中,所有的管理器如:都采用以上的注入回调的方式,实现了管理器互相引用的方式。shiro的子管理器有以下这些:
DefaultWebSecurityManager、
DefaultSecurityManager(RememberMeManager rememberMeManager) extends RememberMeManager没有使用缓存
SessionsSecurityManager(SessionManager sessionManager) extends
AuthorizingSecurityManager(Authorizer authorizer) extends
AuthenticatingSecurityManager(Authenticator authenticator) extends
RealmSecurityManager(Collection realms) extends
CachingSecurityManager(CacheManager cacheManager) implements SecurityManager, Destroyable, CacheManagerAware
SecurityManager extends Authenticator, Authorizer, SessionManager;

详解RealmSecurityManager管理器:
在securityManager配置了 ,
会调用到RealmSecurityManager的setRealm方法:
public void setRealm(Realm realm) {
if (realm == null) {
throw new IllegalArgumentException(“Realm argument cannot be null”);
}
Collection realms = new ArrayList(1);
realms.add(realm);
setRealms(realms);
}
public void setRealms(Collection realms) {
if (realms == null) {
throw new IllegalArgumentException(“Realms collection argument cannot be null.”);
}
if (realms.isEmpty()) {
throw new IllegalArgumentException(“Realms collection argument cannot be empty.”);
}
this.realms = realms;
afterRealmsSet(); //依次回调权限realm和身份realm设置相应的权限模块信息authorizer、身份模块信息authenticator
}
//在子类中重载并依次回调
//1.AuthorizingSecurityManager
protected void afterRealmsSet() {
super.afterRealmsSet();//回调上层的set方法
if (this.authorizer instanceof ModularRealmAuthorizer) {
((ModularRealmAuthorizer) this.authorizer).setRealms(getRealms());
}
}
//2.AuthenticatingSecurityManager
protected void afterRealmsSet() {
super.afterRealmsSet();
if (this.authenticator instanceof ModularRealmAuthenticator) {
((ModularRealmAuthenticator) this.authenticator).setRealms(getRealms());
}
}
//RealmSecurityManager管理器调用applyCacheManagerToRealms,将缓存管理器添加给每个realm
protected void afterRealmsSet() {
applyCacheManagerToRealms();
}
protected void applyCacheManagerToRealms() {
CacheManager cacheManager = getCacheManager();
Collection realms = getRealms();
if (cacheManager != null && realms != null && !realms.isEmpty()) {
for (Realm realm : realms) {
if (realm instanceof CacheManagerAware) {
((CacheManagerAware) realm).setCacheManager(cacheManager);
}
}
}
}

realm对象:注入到securityManager安全管理器中,会设置给身份验证信息与权限验证信息作为数据源
这样身份验证管理器与权限验证管理器就可以获取到realm数据源,进行相应的管理操作
realm管理器持有的realms资源主要是用来给realm对象设置缓存器
RealmSecurityManager( Collection realms;)

权限realm数据源:
AuthorizingRealm extends AuthenticatingRealm
implements Authorizer, Initializable, PermissionResolverAware, RolePermissionResolverAware ;
身份realm数据源:
AuthenticatingRealm extends CachingRealm implements Initializable;
缓存CachingRealm:
CachingRealm implements Realm, Nameable, CacheManagerAware, LogoutAware

通过realm获取权限验证信息、身份验证信息,首先通过缓存管理器查询,若缓存无数据,则通过doGet方法查询相应的数据。

realm数据源信息结构:
权限验证信息:
AuthorizationInfo,该用户具有的哪些权限
身份验证信息:
AuthenticationInfo,该用户的身份信息、密码

详解权限AuthorizingSecurityManager与身份验证管理器AuthenticatingSecurityManager
默认使用以下两个对象进行验证管理:
权限模块:
ModularRealmAuthorizer implements Authorizer,,( Collection realms;)
身份模块:
ModularRealmAuthenticator extends AbstractAuthenticator ( Collection realms;)

详解shiro缓存管理器CacheManager:
使用到缓存的地方有:
1.session管理器
2.身份验证信息realm
3.权限验证信息realm
缓存对象的结构: Cache

阅读更多
版权声明:本文为博主原创文章,转载请声明出处与链接。 https://blog.csdn.net/jieinasiainfo/article/details/51240876
文章标签: shiro 框架 架构
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭