Java魔法之SecurityManager 介绍一些关于SecurityManager的使用案例。 介绍 我们可以通过sun.misc.Unsafe做一些可怕的事情(操作底层)。 SecurityManager manager = System.getSecurityManager(); if (manager ! SecurityManager就是解决这些事情的。 lib库 你可以使用SecurityManager.checkPackageAccess方法限制整个包的使用。 参考: http://mishadoff.com/blog/java-magic-part-5-securitymanager/
(SecurityManager.java:532) at java.lang.SecurityManager. 这时候具备一些SecurityManager的基础知识还是有必要的。 new java.lang.SecurityManager(); } else { try { sm = (SecurityManager)loader.loadClass SecurityManager sm = new SecurityManager(); SecurityManager securityManager = System.getSecurityManager (); System.setSecurityManager(sm); 关闭: SecurityManager securityManager = System.getSecurityManager
上篇文章Shiro源码分析之获取SecurityManager工厂获取我们介绍了SecurityManager工厂的获取步骤,本文在此基础上来分析下SecurityManager对象产生的过程 SecurityManager获取过程 1.SecurityManager接口介绍 SecurityManager安全管理器,是Shiro的核心,继承了三个接口,其定义的方法如下 public interface 2.SecurityManager实例化时序图 ? securityManager) { Collection<Realm> realms = getRealms(securityManager); if (! securityManager; } 初始化SecurityManager完成 4.总结 SecurityManager默认实例的是DefaultSecurityManager 如果我们在shiro.ini
一般使用tomcat可能都没有注意到这个问题,本篇主要讲述tomcat 6中SecurityManager的管理机制,尽量使用简单明了的图片表示其中关系。 其他知识参考tomcat文档翻译。 System.out.println("SecurityManager: " + System.getSecurityManager()); File file = new File("C:/Users 对比下正常启动的输出,SecurityManager会输出null(此时,如果JSP中有system.exit(1);程序就会直接退出): ?
在java.lang包下也有同名的SecurityManager // 1.获取SecurityManager工厂对象 同时将配置文件信息封装到了ini对象中 Factory<SecurityManager > factory = new IniSecurityManagerFactory("classpath:shiro.ini"); // 2.获取SecurityManager对象 SecurityManager securityManager = factory.getInstance(); // 3.将SecurityManager添加到当前的运行环境中 SecurityUtils.setSecurityManager 工厂对象分析 我们先来分析下SecurityManager工厂对象的源代码,来看看具体做了什么事情 // 1.获取SecurityManager工厂对象 同时将配置文件信息封装到了ini对象中 Factory <SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); 2.1先来看下对应的时序图 ?
SecurityManager是Java中的一个类,它允许开发人员控制应用程序对这些资源的访问。 SecurityManager可以实现以下功能:安全策略管理:SecurityManager可以实现安全策略管理,以确保应用程序只能访问它们被授权访问的资源。 访问控制:SecurityManager可以实现访问控制,以确保应用程序只能访问它们被授权访问的资源。 权限管理:SecurityManager可以实现权限管理,以确保应用程序只能执行它们被授权执行的操作。安全审计:SecurityManager可以实现安全审计,以记录应用程序对资源的访问和操作。 在Java中,可以通过System.setSecurityManager()方法来设置SecurityManager。
,即可以理解为是一个 IOC/DI 容器,但是区别在于它从一个根对象SecurityManager 开始。 securityManager = factory.getInstance(); //将SecurityManager设置到SecurityUtils 方便全局使用 SecurityUtils.setSecurityManager 实例: 默认情况先创建一个名字为 securityManager,类型为 org.apache.shiro.mgt.DefaultSecurityManager 的默认的 SecurityManager ,如果想自定义,只需要在 ini 配置文件中指定 “securityManager=SecurityManager 实现类” 即可,名字必须为 SecurityManager,它是起始的根; IniSecurityManagerFactory 如下是 INI 配置分类: [main] ## 提供了对根对象securityManager及其依赖的配置 securityManager=org.apache.shiro.mgt.DefaultSecurityManager
//2.获取securityManager SecurityManager securityManager = factory.getInstance(); //3.将securityManager //2.获取securityManager SecurityManager securityManager = factory.getInstance(); //3.将securityManager 中 securityManager.realms=$permReam (3)验证 public class ShiroTest2 { private SecurityManager securityManager //2.获取securityManager SecurityManager securityManager = factory.getInstance(); //13.将 securityManager绑定到当前运行环境 SecurityUtils.setSecurityManager(securityManager); } @Test
SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者 Shiro SecurityManager 安全管理器;即所有与安全有关的操作都会与SecurityManager ini配置文件中有四大主要配置类 main users roles urls main 提供了对根对象securityManager及其依赖对象的配置 #创建对象 securityManager / 2.通过Factory对象获取SecurityManager对象 SecurityManager securityManager = factory.getInstance(); // 3.将SecurityManager // 2.通过Factory对象获取SecurityManager对象 SecurityManager securityManager = factory.getInstance(); // 3.将SecurityManager对象添加到当前运行环境中 SecurityUtils.setSecurityManager(securityManager); // 4.获取Subject
SecurityManager (org.apache.shiro.mgt.SecurityManager) shiro系统的核心,协调主题使用的操作,验证,配置等。 SecurityManager securityManager = new DefaultSecurityManager(realm); //Make the SecurityManager instance Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); 2) 通过Ini Factory<SecurityManager> factory = new IniSecurityManagerFactory(ini); SecurityManager securityManager
工厂对象 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); // 2.通过Factory对象获取SecurityManager对象 SecurityManager securityManager = factory.getInstance(); // 3.将SecurityManager 对象添加到当前运行环境中 SecurityUtils.setSecurityManager(securityManager); // 4.获取Subject对象 Subject subject securityManager.realms=$customRealm 测试方法和之前一样 @Test public void test() { // 1.获取SecurityManager工厂对象 对象获取SecurityManager对象 SecurityManager securityManager = factory.getInstance(); // 3.将SecurityManager
主题的“幕后”对应对象是SecurityManager。 每个应用程序几乎总是有一个SecurityManager实例。 创建SecurityManager SecurityManager securityManager = factory.getInstance(); // 3。 SecurityManager securityManager = factory.getInstance(); //3,使用SecurityManager可以访问 SecurityManager securityManager = factory.getInstance(); // 使SecurityManager可以访问 SecurityUtils.setSecurityManager
加载 ini 配置, 初始化 SecurityManager Factory<SecurityManager> factory = new IniSecurityManagerFactory (securityManager); // 2. 获取安全管理器securityManager 首先我们看SecurityManager的获取方法factory.getInstance(); ? 以下代码省略部分代码, 保留核心逻辑。 (Ini ini) { SecurityManager securityManager = createSecurityManager(ini); return securityManager ).setRealms(realms); return securityManager; }} 可以看到, 创建SecurityManager的过程主要做了三件事 创建默认的
doGetAuthorizationInfo 完成用户授权的方法 配置ini.xml文件 [main] #自定义 realm customRealm=com.dpb.realm.MyRealm #将realm设置到securityManager securityManager.realms=$customRealm 测试 测试代码和上个案例一模一样 @Test public void test() { // 1.获取SecurityManager 工厂对象 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); / / 2.通过Factory对象获取SecurityManager对象 SecurityManager securityManager = factory.getInstance(); // 3.将SecurityManager 对象添加到当前运行环境中 SecurityUtils.setSecurityManager(securityManager); // 4.获取Subject对象 Subject subject
ini配置文件中有四大主要配置类 main users roles urls main 提供了对根对象securityManager及其依赖对象的配置 #创建对象 securityManager=org.apache.shiro.mgt.DefaultSecurityManager 2.通过Factory对象获取SecurityManager对象 SecurityManager securityManager = factory.getInstance(); // 3.将SecurityManager // 2.通过Factory对象获取SecurityManager对象 SecurityManager securityManager = factory.getInstance(); // 3 .将SecurityManager对象添加到当前运行环境中 SecurityUtils.setSecurityManager(securityManager); // 4.获取Subject 在此方法中我们看到是 SecurityManager来管理认证操作的 继续进入 进入DefaultSecurityManager的login方法 ? 此方法中调用Authenticator认证 ?
对象 SecurityManager securityManager = factory.getInstance(); //3.将生产的SecurityManager 存储到SecurityUtils中,保证SecurityManager在 // 一次请内的任意位置获取的是同一个SecurityManager对象,不同的请求获取的是不同的。 SecurityUtils.setSecurityManager(securityManager); //4.获取subject对象完成认证 Subject subject 对象 SecurityManager securityManager = factory.getInstance(); //3.将生产的SecurityManager存储到 SecurityUtils中,保证SecurityManager在 // 一次请内的任意位置获取的是同一个SecurityManager对象,不同的请求获取的是不同的。
1.2.3 自定义realm Realm域:Shiro从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法 使用基于springboot的配置方式完成SecurityManager,Realm的装配 @Configuration public class ShiroConfiguration { // securityManager(CustomRealm realm) { //使用默认的安全管理器 DefaultWebSecurityManager securityManager shirFilter(SecurityManager securityManager) { //1.创建shiro过滤器工厂 ShiroFilterFactoryBean (); advisor.setSecurityManager(securityManager); return advisor; } }
securityManager:安全管理器,主体进行认证和授权都是通过securityManager进行。 认证过程 认证执行流程 1、通过ini配置文件创建securityManager 2、调用subject.login方法主体提交认证,提交的token 3、securityManager进行认证,securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(customRealm()); securityManager.setSessionManager (sessionManager()); return securityManager; } @Bean(name = "lifecycleBeanPostProcessor = new DefaultWebSecurityManager(); securityManager.setRealm(customRealm()); securityManager.setCacheManager
改造部分 SecurityManager 的配置如下: @Bean public SecurityManager securityManager(OAuthRealm oAuthRealm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm securityManager.setCacheManager(getEhCache()); //securityManager.setSessionManager(sessionManager 解决办法 securityManager: @Bean public SecurityManager securityManager(OAuthRealm oAuthRealm) { return securityManager; }
处理的操作最终都会委托给SecurityManager。 SecurityManager SecurityManager单从字面上我们可以理解为一个安全管理器,所有的Subject都由SecurityManager来管理,它是Shiro的核心,SecurityManager Realm中,SecurityManager在Realm中查询数据进行验证。 2.通过SecurityManager工厂获取到SecurityManager的实例,并将该实例绑定给SecurityUtils,设置给SecurityUtils是一个全局设置,设置一次即可。 ("classpath:shiro-jdbc-realm.ini"); SecurityManager securityManager = factory.getInstance();