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等丰富的信息。
一,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等丰富的信息。
相关文章推荐
- Apache Shiro V1.2 SecurityUtils与SecurityManager的关系以及Subject的创建
- Apache Shiro V1.2 SecurityUtils与SecurityManager的关系以及Subject的创建
- Apache Shiro V1.2 Subject与Session的关系以及创建Session的过程分析
- Apache Shiro V1.2 Factory与SecurityManager及其子类的关系
- 微软企业库4.1学习笔记(二)各功能之间的依赖关系以及对象创建
- SYSFS以及设备文件或kobject目录创建的关系
- 例题:学习数据库查询。学生信息表的创建,主外键关系,以及45道题的查询实例。主要知识点在讲页45页,和讲页65页
- Oracle-数据库、表空间、用户、表之间关系以及创建
- 界面方式创建、修改和删除关系表以及定义表的完整约束
- 今日工作心得:在access数据库中创建表和关系,以及级联删除问题
- Activity和Window以及View之间的聚合关系及创建流程
- [Windows Azure] 创建支持Apache,PHP以及MySQL的CentOS Web Virtual Machine Server
- 微软企业库4.1学习笔记(二)各功能之间的依赖关系以及对象创建
- SpringMVC系列(十五)Spring MVC与Spring整合时实例被创建两次的解决方案以及Spring 的 IOC 容器和 SpringMVC 的 IOC 容器的关系
- php中MVC zend framework框架在apache上的配置方法以及创建步骤,配置虚拟主机
- 使用Apache第三方jar包来访问数据库以及创建数据库连接池
- 创建进程以及进程间的关系
- Android SDK版本号与API级别的对应关系以及创建工程时选择API版本的注意事项
- GPL、BSD、Apache介绍以及三者之间的区别以及Android与他们之间的关系
- Android SDK版本号与API级别的对应关系以及创建工程时选择API版本的注意事项