资讯动态

认识java安全管理器SecurityManager

发布时间:2026/9/6 15:00:21 来源:尧图企业网站定制
1什么是Java安全管理器SecurityManager在看java源码的过程中经常会遇到如下一段代码SecurityManagersSystem.getSecurityManager();ThreadGroupgroup(s!null)?s.getThreadGroup():Thread.currentThread().getThreadGroup();或SecurityManagersecuritySystem.getSecurityManager();if(security!null){security.checkWrite(name);}要想了解它们有什么功能就需要对Java安全管理器有一定的认识。2Java安全管理器的使用场景当运行未知的java程序时该程序可能含有恶意代码如删除系统文件等恶意操作为了防止恶意代码对系统的破坏需要对运行代码的权限进行控制这时候就需要启用java安全管理器。3如何启用java安全管理器方式1启动参数方式推荐方式-Djava.security.manager若同时需要指定安全管理器配置文件的位置使用如下参数默认的配置文件按在**$JAVA_HOME/jre/lib/security/java.policy**-Djava.security.manager-Djava.security.policyE:/java.policy虽然通过启动参数指定本质上也是通过代码方式启动但是方式更灵活。原理可查看启动类 sun.misc.Launcher类有如下一段代码publicLauncher(){Launcher.ExtClassLoadervar1;try{var1Launcher.ExtClassLoader.getExtClassLoader();}catch(IOExceptionvar10){thrownewInternalError(Could not create extension class loader,var10);}try{this.loaderLauncher.AppClassLoader.getAppClassLoader(var1);}catch(IOExceptionvar9){thrownewInternalError(Could not create application class loader,var9);}Thread.currentThread().setContextClassLoader(this.loader);Stringvar2System.getProperty(java.security.manager);if(var2!null){SecurityManagervar3null;if(!.equals(var2)!default.equals(var2)){try{var3(SecurityManager)this.loader.loadClass(var2).newInstance();}catch(IllegalAccessExceptionvar5){}catch(InstantiationExceptionvar6){}catch(ClassNotFoundExceptionvar7){}catch(ClassCastExceptionvar8){}}else{var3newSecurityManager();}if(var3null){thrownewInternalError(Could not create SecurityManager: var2);}System.setSecurityManager(var3);}}方式2编码方式启动不推荐不灵活System.setSecurityManager(newSecurityManager());4安全管理器配置文件解释4.1 配置原则没有配置的权限表示不具有权限只能配置有什么权限不能配置禁用什么权限多种权限可用逗号分隔4.2 配置文件解释// 表示授权路径在 file:${{java.ext.dirs}}/* // 的所有jar和class 文件具有他们的权限 grant codeBasefile:${{java.ext.dirs}}/*{permission java.security.AllPermission;};grant{// 如下都是一些细粒度的权限可查资料了解举几个例子 // 授权 运行时权限 通过stop来停止线程 permission java.lang.RuntimePermissionstopThread;// 授权 socket权限 监听权限 permission java.net.SocketPermissionlocalhost:0,listen;// 能读取java版本的权限 permission java.util.PropertyPermissionjava.version,read;permission java.util.PropertyPermissionjava.vendor,read;permission java.util.PropertyPermissionjava.vendor.url,read;permission java.util.PropertyPermissionjava.class.version,read;permission java.util.PropertyPermissionos.name,read;permission java.util.PropertyPermissionos.version,read;permission java.util.PropertyPermissionos.arch,read;permission java.util.PropertyPermissionfile.separator,read;permission java.util.PropertyPermissionpath.separator,read;permission java.util.PropertyPermissionline.separator,read;permission java.util.PropertyPermissionjava.specification.version,read;permission java.util.PropertyPermissionjava.specification.vendor,read;permission java.util.PropertyPermissionjava.specification.name,read;permission java.util.PropertyPermissionjava.vm.specification.version,read;permission java.util.PropertyPermissionjava.vm.specification.vendor,read;permission java.util.PropertyPermissionjava.vm.specification.name,read;permission java.util.PropertyPermissionjava.vm.version,read;permission java.util.PropertyPermissionjava.vm.vendor,read;permission java.util.PropertyPermissionjava.vm.name,read;};5代码中使用java安全管理器场景SecurityManager 实例包含了许多 checkXXX 的方法表示检查是否具备对应的权限如sm.checkDelete(D:\\xx.txt);// 是否具有指定文件的删除权限当开启java安全管理器后若没有对应的权限而执行了就会抛出无权限的异常。Launcherfailed-Dump ThreadsandExitactions are unavailable(access denied(java.io.FilePermissionD:\install\IntelliJIDEA2020.1\bin\breakgen64.dllread))Exceptionin threadmainjava.security.AccessControlException:access denied(java.io.FilePermissionD:\xx.txtdelete)atjava.security.AccessControlContext.checkPermission(AccessControlContext.java:472)atjava.security.AccessController.checkPermission(AccessController.java:886)atjava.lang.SecurityManager.checkPermission(SecurityManager.java:549)atjava.lang.SecurityManager.checkDelete(SecurityManager.java:1007)atorg.example.controller.SecurityManagerDemo.main(SecurityManagerDemo.java:8)对于这类问题我们只需要在安全管理器对应的配置文件中添加对应权限或者不启用安全管理器即可如permissionjava.io.FilePermissionD:\\xx.txt,delete;案例1文件删除查看 File 类的 delete 方法源码如下publicbooleandelete(){SecurityManagersecuritySystem.getSecurityManager();if(security!null){security.checkDelete(path);}if(isInvalid()){returnfalse;}returnfs.delete(this);}可以看出在执行删除时会用先获取安全管理器然后调用checkDelete(path) 方法检查是否具有该文件的删除权限。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价