java security

查看@Bean(destroyMethod="xxx")等同于DisposableBeandestroy(),用于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

待完成…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值