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()),完成主题创建的。
二,最终受到创建的代码
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);
- }