JUnit SecurityManager

Java程序在默认情况下是没有安装默认的安全管理器, 所以如果需要使用安全管理器, 需要在运行时指定启动项:-Djava.security.manager。

 

但在使用JUnit运行时,比如运行测试用例,可能会出现问题:

java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:3063 connect,resolve)

at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)

at java.security.AccessController.checkPermission(AccessController.java:546)

at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)

at java.net.Socket.connect(Socket.java:513)

at java.net.Socket.connect(Socket.java:469)

at java.net.Socket.<init>(Socket.java:366)

at java.net.Socket.<init>(Socket.java:180)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.connect(RemoteTestRunner.java:570)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:373)

 

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

 

看如下程序:

public class SecurityManager1Test {

/**

* -Djava.security.manager

* permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve";

* permission java.lang.RuntimePermission "accessDeclaredMembers";

*/

@Test

public void getSecurityManager() {

SecurityManager sm = System.getSecurityManager();

if (sm == null) {

System.out.println("no security manager");

} else {

System.out.println("exist security manager");

}

}

 

}

 

在运行时如果不加上启动项:-Djava.security.manager,运行结果如下:

no security manager

 

如果加上启动项:-Djava.security.manager,运行结果如下:

java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:3070 connect,resolve)

at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)

at java.security.AccessController.checkPermission(AccessController.java:546)

at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)

at java.net.Socket.connect(Socket.java:513)

at java.net.Socket.connect(Socket.java:469)

at java.net.Socket.<init>(Socket.java:366)

at java.net.Socket.<init>(Socket.java:180)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.connect(RemoteTestRunner.java:570)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:373)

 

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

 

 

这个时候需要添加访问权限,具体在jre\lib\security\java.policy策略文件中添加访问策略。

 

在上面的错误信息, 应该是没有java.net.SocketPermission 127.0.0.1:3165 connect,resolve访问权限,打开jre\lib\security\java.policy, 在最后添加:

 

permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve";

 

运行后结果如下:

java.security.AccessControlException: access denied (java.lang.RuntimePermission accessDeclaredMembers)

at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)

at java.security.AccessController.checkPermission(AccessController.java:546)

at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

at java.lang.SecurityManager.checkMemberAccess(SecurityManager.java:1662)

at java.lang.Class.checkMemberAccess(Class.java:2157)

at java.lang.Class.getDeclaredMethods(Class.java:1790)

at org.junit.internal.MethodSorter.getDeclaredMethods(MethodSorter.java:54)

at org.junit.runners.model.TestClass.scanAnnotatedMembers(TestClass.java:65)

at org.junit.runners.model.TestClass.<init>(TestClass.java:57)

at org.junit.runners.ParentRunner.createTestClass(ParentRunner.java:88)

at org.junit.runners.ParentRunner.<init>(ParentRunner.java:83)

at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)

at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:10)

at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)

at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)

at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)

at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:84)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:70)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:43)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

 

 

还是报错,需要添加java.lang.RuntimePermission accessDeclaredMembers访问策略,打开jre\lib\security\java.policy, 在最后添加:

permission java.lang.RuntimePermission "accessDeclaredMembers";

 

运行后结果如下:

exist security manager

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值