Java安全模型通过权限类体系对各类系统资源的访问进行管控,PropertyPermission类就是其中专门负责系统属性访问控制的权限类,它定义了程序可以执行哪些系统属性相关的操作,是构建安全Java应用的重要组件。

PropertyPermission类基本概念
PropertyPermission类位于java.util包下,继承自java.security.BasicPermission类,属于Java安全架构中的权限实现类。它的核心作用是限制代码对系统属性的访问行为,系统属性通常包含运行环境信息、用户配置信息等敏感内容,通过PropertyPermission可以指定某段代码只能读取特定属性,或者只能修改特定属性,避免敏感信息泄露或属性被恶意篡改。
核心构造方法与参数说明
PropertyPermission类提供了两个常用的构造方法,用于创建权限实例:
- PropertyPermission(String name, String actions):name参数指定要控制的系统属性名称,支持通配符*;actions参数指定允许的操作,可选值为read、write,多个操作之间用逗号分隔。
- PropertyPermission(String name, String actions, boolean allNames):该构造方法为内部使用为主,一般开发者不需要直接调用。
下面是一个创建PropertyPermission实例的代码示例:
import java.util.PropertyPermission;
public class PermissionDemo {
public static void main(String[] args) {
// 创建只允许读取user.home属性的权限
PropertyPermission readHomePermission = new PropertyPermission("user.home", "read");
// 创建允许读写所有以java.开头的系统属性的权限
PropertyPermission javaPropPermission = new PropertyPermission("java.*", "read,write");
System.out.println("读取user.home权限名称:" + readHomePermission.getName());
System.out.println("java属性权限操作:" + javaPropPermission.getActions());
}
}
权限目标与操作规则
权限目标(name参数)
name参数用于指定要控制的系统属性名称,支持两种形式:
- 精确名称:如user.home,仅匹配该具体的系统属性。
- 通配符形式:使用*作为通配符,如java.*匹配所有以java.开头的系统属性,*匹配所有系统属性。
权限操作(actions参数)
actions参数指定允许对目标属性执行的操作,仅支持以下两个值:
| 操作值 | 含义 |
|---|---|
| read | 允许读取目标系统属性的值,对应System.getProperty()方法调用 |
| write | 允许修改目标系统属性的值,对应System.setProperty()方法调用 |
如果actions参数为空字符串,则表示不允许执行任何操作。
安全策略中的配置方式
在Java的安全策略文件(通常为java.policy)中,可以通过grant块配置PropertyPermission权限,指定某段代码拥有的属性访问权限。策略文件配置示例如下:
// 给所有代码授予读取user.home属性的权限
grant {
permission java.util.PropertyPermission "user.home", "read";
// 给指定路径的代码授予读写所有java.开头属性的权限
permission java.util.PropertyPermission "java.*", "read,write";
};
代码示例:自定义权限检查
我们可以在代码中主动检查当前上下文是否拥有对应的PropertyPermission权限,示例如下:
import java.security.AccessController;
import java.security.Permission;
import java.util.PropertyPermission;
public class PropertyCheckDemo {
public static void main(String[] args) {
// 要检查的系统属性名
String propertyName = "user.home";
// 创建对应的权限对象
Permission requiredPermission = new PropertyPermission(propertyName, "read");
try {
// 执行权限检查
AccessController.checkPermission(requiredPermission);
// 如果检查通过,执行读取操作
String homePath = System.getProperty(propertyName);
System.out.println("读取到user.home属性值:" + homePath);
} catch (SecurityException e) {
System.out.println("没有读取" + propertyName + "属性的权限");
}
}
}
注意事项
- PropertyPermission的权限检查是和Java的安全管理器(SecurityManager)配合使用的,如果应用中没有启用SecurityManager,那么即使配置了权限策略,也不会生效。
- 通配符的使用要谨慎,避免使用*授予所有属性的访问权限,尽量遵循最小权限原则,只授予必要的属性访问权限。
- 系统属性分为只读属性和可写属性,部分系统属性如java.version是只读的,即使授予write权限也无法修改,修改时会抛出IllegalArgumentException。
PropertyPermission是Java安全模型中细粒度控制属性访问的重要手段,合理运用可以有效降低应用的安全风险,尤其在企业级应用和需要沙箱运行的环境中有着广泛的应用场景。
PropertyPermissionJava安全模型系统属性访问控制Java权限管理修改时间:2026-06-18 19:57:30