热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaSecurityManager解析与使用详解

JavaSecurityManager类解析SecurityManager,顾名思义,安全管理,通俗地讲,该类用于对jav

Java SecurityManager类解析

SecurityManager,顾名思义,安全管理,通俗地讲,该类用于对java程序的某些行为进行安全检查,判断该行为是否合法,是否要继续执行。

首先,我们来看看SecurityManager的构造方法:

public SecurityManager() {synchronized(SecurityManager.class) {SecurityManager sm = System.getSecurityManager();if (sm != null) {// ask the currently installed security manager if we// can create a new one.sm.checkPermission(new RuntimePermission("createSecurityManager"));}initialized = true;}}

我们在创建一个SecurityManager对象时,构造方法里会调用System类里的getSecurityManager()方法,System类下的getSecurityManager()与返回值security 成员变量如下:

private static volatile SecurityManager security = null;
public static SecurityManager getSecurityManager() {return security;}

在没有对security赋值前,security为null,getSecurityManager()返回的也是null,在SecurityManager构造方法里,若System.getSecurityManager()返回是null,则不会执行if语句里的权限检查代码块。小伙伴们可能就想,System里既然有getSecurityManager(),那肯定也有相关的set方法,当然,不然的话一直返回null那不就没有意义了吗,我们来看看:

public staticvoid setSecurityManager(final SecurityManager s) {try {s.checkPackageAccess("java.lang");} catch (Exception e) {// no-op}setSecurityManager0(s);}private static synchronizedvoid setSecurityManager0(final SecurityManager s) {SecurityManager sm &#61; getSecurityManager();if (sm !&#61; null) {// ask the currently installed security manager if we// can replace it.sm.checkPermission(new RuntimePermission("setSecurityManager"));}if ((s !&#61; null) && (s.getClass().getClassLoader() !&#61; null)) {AccessController.doPrivileged(new PrivilegedAction<Object>() {public Object run() {s.getClass().getProtectionDomain().implies(SecurityConstants.ALL_PERMISSION);return null;}});}security &#61; s;}

两个关于set的方法&#xff0c;我们来看最后一行代码 security &#61; s; 这里就是开始设置System类里的security变量&#xff0c;设置后返回就不会是null了&#xff0c;而s由setSecurityManager0方法参数传进来&#xff0c;setSecurityManager0由setSecurityManager调用&#xff0c;我们最后回归到第一个set方法&#xff0c;第一个set方法的s变量也由外部传入。我想了想&#xff0c;System类或者其他类里在进行某些操作时会不会有自动调用setSecurityManager的方法&#xff0c;很抱歉没有&#xff0c;所以总结出来&#xff0c;该方法需要我们手动调用并赋值&#xff0c;大家就可以简单理解为&#xff1a;

我们需要手动开启SecurityManager的安全检查&#xff0c;开启后SecurityManager即可为其他方法行为进行权限检查

//示例Runtime里的exit方法进行时就会进行行为检查
public void exit(int status) {SecurityManager security &#61; System.getSecurityManager();if (security !&#61; null) {security.checkExit(status);}Shutdown.exit(status);}

SecurityManager通过抛出异常来阻止没有权限或敏感操作的完成。 如果操作被允许执行&#xff0c;则简单的返回&#xff0c;如果操作被拒绝&#xff0c;则抛出一个SecurityException。 对于这种处理方式唯一的例外就是checkTopLevelWindow方法&#xff0c;此方法返回boolean值。

当前安全管理器被设置通过System类的setSecurityManager方法。获取当前安全管理器用System类的getSecurityManager方法。
SecurityManager中特定的方法checkPermission(java.security.Permission)负责明确允许还是拒绝由指定权限所指示的访问请求&#xff0c;默认的实现是&#xff1a;
AccessController.checkPermission(perm);
若果一个请求访问被允许&#xff0c;则checkPermission安静的返回&#xff0c;如果被拒绝&#xff0c;则抛出一个SecurityException异常。

从Java 2 SDK v1.2 开始&#xff0c;SecurityManager 中其他所有 check 方法的默认实现都是调用 SecurityManager checkPermission
方法来确定调用线程是否具有执行所请求操作的权限。

权限分为以下类别&#xff1a;文件、套接字、网络、安全性、运行时、属性、AWT、反射和可序列化。管理各种权限类别的类是   java.io.FilePermission

java.net.SocketPermission

java.net.NetPermission

java.security.SecurityPermission

java.lang.RuntimePermission

java.util.PropertyPermission

java.awt.AWTPermission

java.lang.reflect.ReflectPermission

java.io.SerializablePermission

//示例&#xff0c;通过Runtime类的exit方法中的security.checkExit(status)&#xff0c;我们来到SecurityManager类下的checkExit方法&#xff0c;该方法//就创建了RuntimePermission对象public void checkExit(int status) {checkPermission(new RuntimePermission("exitVM."&#43;status));}

除前两个&#xff08;FilePermission 和 SocketPermission&#xff09;类以外的所有类都是 java.security.BasicPermission 的子类&#xff0c;而 java.security.BasicPermission 类又是顶级权限类 java.security.Permission 的抽象子类. BasicPermission 定义了所有权限所需的功能&#xff0c;这些功能的名称遵从分层属性命名惯例&#xff08;例如“exitVM”、“setFactory”、“queuePrintJob”等等&#xff09;。在名称的末尾可能出现一个星号&#xff0c;前面是“.”或星号&#xff0c;这表示通配符匹配。例如&#xff1a;“a.”、“”是有效的&#xff0c;而“a”或“ab”是无效的。
FilePermission 和 SocketPermission 是顶级权限类 (java.security.Permission) 的子类。像这些命名语法比 BasicPermission 所用的语法更为复杂的类都直接是 Permission 的子类&#xff0c;而不是 BasicPermission 的子类。例如&#xff0c;对于 java.io.FilePermission 对象而言&#xff0c;权限名就是文件&#xff08;或目录&#xff09;的路径名。

某些权限类具有一个“动作”列表&#xff0c;告知允许对象所执行的动作。例如&#xff0c;对于 java.io.FilePermission 对象&#xff0c;动作列表&#xff08;如“读、写”&#xff09;指定了允许对指定文件&#xff08;或指定目录中的文件&#xff09;执行哪些动作。其他权限类是“指定的”权限 - 有名称但没有动作列表的类&#xff1b;您也许有指定的权限&#xff0c;也许没有。注&#xff1a;还有一个暗指所有权限的 java.security.AllPermission 权限。该权限是为了简化系统管理员的工作而存在的&#xff0c;因为管理员可能需要执行很多需要所有&#xff08;或许多&#xff09;权限的任务。

SecurityManager应用场景&#xff1a;

当运行未知的Java程序的时候&#xff0c;该程序可能有恶意代码&#xff08;删除系统文件、重启系统等&#xff09;&#xff0c;为了防止运行恶意代码对系统产生影响&#xff0c;需要对运行的代码的权限进行控制&#xff0c;这时候就要启用Java安全管理器。

启动安全管理器&#xff1a;


  • 参数启动&#xff08;指定 -Djava.security.manager&#xff09;
  • 通过程序打开SecurityManager SecurityManager sm &#61; new SecurityManager(); System.setSecurityManager(sm);

关闭安全管理器&#xff1a;

程序关闭&#xff1a; SecurityManager sm &#61; System.getSecurityManager(); if(sm !&#61; null){ System.setSecurityManager(null); }


推荐阅读
author-avatar
弥囜_550
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有