? ? SecurityManager sm = getSecurityManager();

? ? if (sm != null) {

? ? ? ?sm.checkPermission(new RuntimePermission("getenv."+name));

? ? }

? ? return ProcessEnvironment.getenv(name);

? }

}


这是因为 Java 的安全检查管理器和操作系统的权限检查不是一个概念,Java 编写的不只是服务端应用程序,它还可以作为客户端跑在浏览器上(Applet),它还可以以 app 的形式跑在手机上(J2ME),针对不同的平台 JVM 会使用不同的安全策略。对于 Applet 而言,受限尤其严苛,通常都不允许 Applet 来操作本地文件。待 Java 的安全检查通过后执行具体的 IO 操作时,操作系统还会继续进行权限检查。

我们平时在本地运行 java 程序时通常都不会默认打开安全检查器,需要执行 jvm 参数才会打开

$ java -Djava.security.manager xxx

$ java -Djava.security.manager -DDjava.security.policy="${policypath}"


因为安全限制条件可以定制,所以还需要提供具体的安全策略文件路径,默认的策略文件路径是 JAVA/_HOME/jre/lib/security/java.policy,下面让我们来看看这个文件里都写了些什么

// 内置扩展库授权规则

// 表示 JAVA_HOME/jre/lib/ext/ 目录下的类库可以全权访问任意资源

// 包含 javax.swing., javax.xml., javax.crypto.* 等等

grant codeBase "file:${{java.ext.dirs}}/*" {

?permission java.security.AllPermission;

};

// 其它类库授权规则

grant {

// 允许线程调用自己的 stop 方法自杀

?permission java.lang.RuntimePermission "stopThread";

?// 允许程序监听 localhost 的随机可用端口,不允许随意订制端口

permission java.net.SocketPermission "localhost:0", "listen";

?// 限制获取系统属性,下面一系列的配置都是只允许读部分内置属性

permission java.util.PropertyPermission "java.version", "read";

?permission java.util.PropertyPermission "java.vendor", "read";

?permission java.util.PropertyPermission "java.vendor.url", "read";

?permission java.util.PropertyPermission "java.class.version", "read";

?permission java.util.PropertyPermission "os.name", "read";

?permission java.util.PropertyPermission "os.version", "read";

?permission java.util.PropertyPermission "os.arch", "read";

?permission java.util.PropertyPermission "file.separator", "read";

?permission java.util.PropertyPermission "path.separator", "read";

?permission java.util.PropertyPermission "line.separator", "read";

?permission java.util.PropertyPermission "java.specification.version", "read";

?permission java.util.PropertyPermission "java.specification.vendor", "read";

?permission java.util.PropertyPermission "java.specification.name", "read";

?permission java.util.PropertyPermission "java.vm.specification.version", "read";

?permission java.util.PropertyPermission "java.vm.specification.vendor", "read";

?permission java.util.PropertyPermission "java.vm.specification.name", "read";

?permission java.util.PropertyPermission "java.vm.version", "read";

?permission java.util.PropertyPermission "java.vm.vendor", "read";

?permission java.util.PropertyPermission "java.vm.name", "read";

};


grant 如果提供了 codeBase 参数就是针对具体的类库来配置权限规则,如果没有指定 codeBase 就是针对所有其它类库配置的规则。

安全检查没有通过,那就会抛出 java.security.AccessControlException 异常。即使安全检查通过了,操作系统的权限检查仍然可能通不过,这时候又会抛出其它类型的异常。

授权规则采用白名单,依据上面的配置意味着启用默认安全策略的 JVM 将无法访问本地文件。如果需要访问本地文件,可以增加下面的规则

permission java.io.FilePermission "/etc/passwd", "read";

permission java.io.FilePermission "/etc/shadow", "read,write";

permission java.io.FilePermission "/xyz", "read,write,delete";

// 允许读所有文件

permission java.io.FilePermission "*", "read";


Permission 的配置参数正好对应了它的构造器参数

public FilePermission(String path, String actions) {

super(path);

? init(getMask(actions));

}


Java 默认安全规则分为几大模块,每个模块都有各自的配置参数

![图片](https://s2.51cto.com/images/20210828/1630161978393010.jpg)

其中 AllPermission 表示打开所有权限。还有一个不速之客 HibernatePermission,它并不是内置的权限模块,它是 Hibernate 框架为自己订制的,这意味着安全规则是支持自定义扩展的。扩展也很简单,可以自己编写一个 Permission 子类,实现它的 4 个抽象方法。

abstract class Permission {

// 权限名称,对于文件来说就是文件名,对于套接字来说就是套接字地址

// 它的意义是子类可定制的

private String name;

// 当前权限对象是否隐含了 other 权限

// 比如 AllPermission 的这个方法总是返回 true

public abstract boolean implies(Permission other);

// equals 和 hashcode 用于权限比较

public abstract boolean equals(Object obj);

public abstract int hashCode();

// 权限选项 read,write,xxx

public abstract String getActions();

}

class CustomPermission extends Permission {

private String actions;

CustomPermission(string name, string actions) {

super(name)

this.actions = actions;

}

}


JVM 启动时会将 profile 里面定义的权限规则加载到权限池中,用户程序在特定的 API 方法里使用权限池来判断是否包含调用这个 API 的权限,最终会落实到调用权限池中每一个权限对象的 implies 方法来判断是否具备指定权限。

class CustomAPI {

最后

既已说到spring cloud alibaba,那对于整个微服务架构,如果想要进一步地向上提升自己,到底应该掌握哪些核心技能呢?

就个人而言,对于整个微服务架构,像RPC、Dubbo、Spring Boot、Spring Cloud Alibaba、Docker、kubernetes、Spring Cloud Netflix、Service Mesh等这些都是最最核心的知识,架构师必经之路!下图,是自绘的微服务架构路线体系大纲,如果有还不知道自己该掌握些啥技术的朋友,可根据小编手绘的大纲进行一个参考。

image

如果觉得图片不够清晰,也可来找小编分享原件的xmind文档!

且除此份微服务体系大纲外,我也有整理与其每个专题核心知识点对应的最强学习笔记:

  • 出神入化——SpringCloudAlibaba.pdf

  • SpringCloud微服务架构笔记(一).pdf

  • SpringCloud微服务架构笔记(二).pdf

  • SpringCloud微服务架构笔记(三).pdf

  • SpringCloud微服务架构笔记(四).pdf

  • Dubbo框架RPC实现原理.pdf

  • Dubbo最新全面深度解读.pdf

  • Spring Boot学习教程.pdf

  • SpringBoo核心宝典.pdf

  • 第一本Docker书-完整版.pdf

  • 使用SpringCloud和Docker实战微服务.pdf

  • K8S(kubernetes)学习指南.pdf

需要下载的请点击传送门:《出神入化——SpringCloudAlibaba》

image

另外,如果不知道从何下手开始学习呢,小编这边也有对每个微服务的核心知识点手绘了其对应的知识架构体系大纲,不过全是导出的xmind文件,全部的源文件也都在此,照样可免费分享给有需要的你!

image