您的位置:首页 > 运维架构 > Apache

Apache Shiro V1.2 SecurityUtils与SecurityManager的关系以及Subject的创建

2017-09-14 20:50 435 查看
SecurityUtils是一个抽象的工具类,提供了SecurityManager实例的保存和获取的方法,以及创建主题的方法。
一,SecurityUtils中的方法SecurityUtils提供了getSecurityManager()和setSecurityManager外,还有个特别的方法getSubject(),这是获取主题的最有效的途径。下面是 SecurityUtils提供的三个方法:public static void setSecurityManager(SecurityManager securityManager){
SecurityUtils.securityManager = securityManager;
}
public static SecurityManager getSecurityManager()throws UnavailableSecurityManagerException {
SecurityManager securityManager = ThreadContext.getSecurityManager();
if(securityManager == null){
securityManager = SecurityUtils.securityManager;
}
if(securityManager == null){
String msg =“没有SecurityManager可访问调用代码,绑定到”+“
ThreadContext.class.getName()+“或作为vm静态单例,这是一个无效的应用程序”+“
“组态。”;
抛出新的UnavailableSecurityManagerException(msg);
}
返回securityManager;
}

public static Subject getSubject(){
主题= ThreadContext.getSubject();
if(subject == null){
subject =(new Subject.Builder())。buildSubject();
ThreadContext.bind(主题);
}
退学科
}

实际上,创建的主题的工作还是由SecurityManager来完成的。Buidler是在主题的内类,在Buidler中通过SecurityUtils获取到了SecurityManager,调用buildSubject()。在buildSubject()中调用了securityManager.createSubject()方法(由SecurityManager的子类DefaultSecurityManager的实现createSubject()),完成主题创建的。
4000

二,最终受到创建的代码
DefaultSecurityManager实例化的时候,生成了 SubjectFactory子类DefaultSubjectFactory实例的属性。 DefaultSecurityManager的createSubject()方法调用 DefaultSubjectFactory的createSubject()方法最终完成了主体的创建:下面是DefaultSubjectFactory中createSubject()方法的代码:public Subject createSubject(SubjectContext context){
SecurityManager securityManager = context.resolveSecurityManager();
Session session = context.resolveSession();
boolean sessionCreationEnabled = context.isSessionCreationEnabled();
PrincipalCollection principals = context.resolvePrincipals();
boolean authenticated = context.resolveAuthenticated();
String host = context.resolveHost();

返回新的DelegatingSubject(principal,authenticated,host,session,sessionCreationEnabled,securityManager);
}
可见,主题的最终实例是DelegatingSubject的实例,并且包含主机,authenticated,principals,securityManager等丰富的信息。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐