`
lobin
  • 浏览: 425952 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 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

分享到:
评论

相关推荐

    基于JAVA的两个通用安全模块的设计与实现(源代码+论文).rar

    8. **JUnit测试**:为了保证代码质量,开发过程中可能使用了JUnit进行单元测试,验证各模块的功能正确性。 9. **Maven或Gradle构建工具**:Java项目通常会使用Maven或Gradle进行依赖管理和构建,这两个工具可以帮助...

    java 权限管理系统

    Java的安全模型是基于类装载器和访问控制机制的,它在运行时为每个类加载器创建了一个安全上下文,这个上下文定义了该类加载器可以访问哪些代码和资源。Java SecurityManager是安全管理的主要组件,它可以阻止不被...

    用于测试shiro中自定义Realm的测试代码

    Apache Shiro是一个强大的Java安全框架,它提供了身份验证、授权、会话管理和加密等功能,使得在Java应用中处理安全性变得更加简单。在这个名为“用于测试shiro中自定义Realm的测试代码”的项目中,我们主要关注的是...

    shiro测试代码

    Apache Shiro 是一个强大且易用的 Java 安全框架,它提供了认证、授权、加密和会话管理功能,可以非常方便地为应用程序提供安全保障。Shiro 能够与 Spring 框架很好地集成,使得在 Spring 应用中使用 Shiro 成为可能...

    shiro认证.pdf

    Apache Shiro是一个全面的Java安全框架,它提供了身份验证、授权、加密以及会话管理等功能。Shiro框架在Java企业应用中广泛使用,因为它简单易用,同时功能强大。本文档主要介绍Shiro认证的基本流程以及如何使用...

    shiro安全框架jar包.zip

    - `junit-4.9.jar`:JUnit是Java编程语言的一个单元测试框架,这里可能是为了进行Shiro相关功能的测试。 6. **SLF4J API**: - `slf4j-api-1.7.5.jar`:SLF4J的API接口,供应用程序使用,与具体的日志实现(如Log...

    SpringBoot+Shiro权限管理系统脚手架.zip

    7. **单元测试**:了解如何使用JUnit对业务逻辑进行单元测试,确保代码的正确性。 8. **持续集成与部署**:学习使用Git进行版本控制,通过Maven或Gradle构建项目,以及如何将应用部署到云服务器或本地服务器。 这...

    IDEA+SSM+Shiro(demo)

    10. 测试:创建JUnit测试类,对SSM+Shiro的功能进行单元测试。 在项目中,`SSMShiroDemo`可能包含上述所有配置和代码的实例,你可以直接运行这个项目来观察SSM+Shiro的运作。通过此DEMO,你可以学习如何在IDEA中...

    6thGear-Reboot-App

    6thGear-Reboot-App 是一个基于Java技术开发的应用程序,根据其命名,可能是用于系统重启或性能优化的工具。这个应用可能具有自动化、高效和可靠的特点,旨在提高设备的运行效率或者解决系统卡顿等问题。下面我们将...

    shiro整合spring项目实例

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。在本项目实例中,我们将深入探讨如何将Shiro与Spring框架整合,以实现更高效、灵活的...

    shiro与spring集成基础Hello案例详解

    功能测试是使用Junit测试框架来测试Shiro的功能。下面是一个简单的测试示例: ```java @Test public void testHello() throws Exception { //①.拿到权限管理对象 Factory&lt;SecurityManager&gt; factory = new ...

    shiro框架Demo演示

    Apache Shiro是一个强大且易用的Java安全框架,它提供了认证、授权、加密和会话管理功能,可以简化开发人员处理安全问题的过程。本Demo旨在深入浅出地展示Shiro框架的基本用法,帮助开发者快速理解和应用到实际项目...

    shiro demo 例子

    - **测试类**:可能包含 JUnit 测试用例,用于验证 Shiro 功能的正确性。 - **资源文件**:如用户、角色和权限的定义,可能存在于 XML 或数据库中。 - **pom.xml**:Maven 项目配置文件,列出了 Shiro 和其他依赖库...

    shiro_01:springmvc+mybatis+shrio整合

    Apache Shiro是一个强大且易用的Java安全框架,提供身份验证、授权、会话管理和加密等功能。 【描述】"shiro_01 springmvc + mybatis + shrio匹配xuy"这部分描述可能是指在项目中,开发者(可能是“xuy”)已经将...

Global site tag (gtag.js) - Google Analytics