查看@Bean(destroyMethod="xxx")
等同于DisposableBean
的destroy()
,用于bean销毁后的后置操作。查看相关调用,发现DisposableBeanAdapter
中调用
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
((DisposableBean) this.bean).destroy();
return null;
}, this.acc);
}
else {
((DisposableBean) this.bean).destroy();
}
两个点System.getSecurityManager()
和AccessController.doPrivileged
。
System.getSecurityManager()
获取Java的安全管理器,默认不打开安全检查,如果不打开,本地程序拥有所有权限。可以通过
System.getProperty("java.security.manager");
查看是否开启。
开启安全管理器命令
1、命令方式
-Djava.security.manager
2、通过代码
SecurityManager sm = new SecurityManager();
System.setSecurityManager(sm);
关闭
SecurityManager sm = System.getSecurityManager();
if(sm != null){
System.setSecurityManager(null);
}
上面的代码只有你在位于${JDK_HOME}/jre/lib/security
目录下或者其他指定目录下的java.policy
文件中指定了一个权限才会奏效。 这个权限是:
permission java.lang.RuntimePermission "setSecurityManager";
SecurityManager
中有很多checkXXX方法,主要通过AccessController.checkPermission
实现。
Permission
是顶层安全类接口,包括RuntimePermission、FilePermission、SocketPermission
等。对应操作包括read、write、listen
等。相关操作在SecurityConstants
类中定义。
通过${JDK_HOME}/jre/lib/security
中的java.policy
定义相关操作权限。没有定义通过check检查会抛出java.security.AccessControlExceptio
异常。
自定义安全策略,
1、通过代码
System.setProperty("java.security.policy", "xxx.policy");
2、通过命令-Djava.security.policy=xxx.policy
指定
public class FilePermissionDemo {
public static void main(String[] args) throws MalformedURLException {
// System.setProperty("java.security.policy", "policy/demo2.policy");
System.setSecurityManager(new SecurityManager());
fileAction("C:/abcsys");
}
public static void fileAction(String filePath) {
try {
File file = new File(filePath);
String[] list = file.list();
for (String s : list) {
System.out.println(s);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 异常 java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\abcsys" "read")
// 如果开启注释,程序运行正常
// demo2.policy
grant codeBase "file:${user.dir}/-" {
permission java.io.FilePermission "c:/abcsys/","read,write";
};
grant {
permission java.io.FilePermission "C:/test", "read";
}
// 表示在项目根目录下的代码,拥有对 c:/abcsys 目录文件的读写权限
AccessController.doPrivileged
待完成…