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
相关推荐
8. **JUnit测试**:为了保证代码质量,开发过程中可能使用了JUnit进行单元测试,验证各模块的功能正确性。 9. **Maven或Gradle构建工具**:Java项目通常会使用Maven或Gradle进行依赖管理和构建,这两个工具可以帮助...
Java的安全模型是基于类装载器和访问控制机制的,它在运行时为每个类加载器创建了一个安全上下文,这个上下文定义了该类加载器可以访问哪些代码和资源。Java SecurityManager是安全管理的主要组件,它可以阻止不被...
Apache Shiro是一个强大的Java安全框架,它提供了身份验证、授权、会话管理和加密等功能,使得在Java应用中处理安全性变得更加简单。在这个名为“用于测试shiro中自定义Realm的测试代码”的项目中,我们主要关注的是...
Apache Shiro 是一个强大且易用的 Java 安全框架,它提供了认证、授权、加密和会话管理功能,可以非常方便地为应用程序提供安全保障。Shiro 能够与 Spring 框架很好地集成,使得在 Spring 应用中使用 Shiro 成为可能...
Apache Shiro是一个全面的Java安全框架,它提供了身份验证、授权、加密以及会话管理等功能。Shiro框架在Java企业应用中广泛使用,因为它简单易用,同时功能强大。本文档主要介绍Shiro认证的基本流程以及如何使用...
- `junit-4.9.jar`:JUnit是Java编程语言的一个单元测试框架,这里可能是为了进行Shiro相关功能的测试。 6. **SLF4J API**: - `slf4j-api-1.7.5.jar`:SLF4J的API接口,供应用程序使用,与具体的日志实现(如Log...
7. **单元测试**:了解如何使用JUnit对业务逻辑进行单元测试,确保代码的正确性。 8. **持续集成与部署**:学习使用Git进行版本控制,通过Maven或Gradle构建项目,以及如何将应用部署到云服务器或本地服务器。 这...
10. 测试:创建JUnit测试类,对SSM+Shiro的功能进行单元测试。 在项目中,`SSMShiroDemo`可能包含上述所有配置和代码的实例,你可以直接运行这个项目来观察SSM+Shiro的运作。通过此DEMO,你可以学习如何在IDEA中...
6thGear-Reboot-App 是一个基于Java技术开发的应用程序,根据其命名,可能是用于系统重启或性能优化的工具。这个应用可能具有自动化、高效和可靠的特点,旨在提高设备的运行效率或者解决系统卡顿等问题。下面我们将...
Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。在本项目实例中,我们将深入探讨如何将Shiro与Spring框架整合,以实现更高效、灵活的...
功能测试是使用Junit测试框架来测试Shiro的功能。下面是一个简单的测试示例: ```java @Test public void testHello() throws Exception { //①.拿到权限管理对象 Factory<SecurityManager> factory = new ...
Apache Shiro是一个强大且易用的Java安全框架,它提供了认证、授权、加密和会话管理功能,可以简化开发人员处理安全问题的过程。本Demo旨在深入浅出地展示Shiro框架的基本用法,帮助开发者快速理解和应用到实际项目...
- **测试类**:可能包含 JUnit 测试用例,用于验证 Shiro 功能的正确性。 - **资源文件**:如用户、角色和权限的定义,可能存在于 XML 或数据库中。 - **pom.xml**:Maven 项目配置文件,列出了 Shiro 和其他依赖库...
Apache Shiro是一个强大且易用的Java安全框架,提供身份验证、授权、会话管理和加密等功能。 【描述】"shiro_01 springmvc + mybatis + shrio匹配xuy"这部分描述可能是指在项目中,开发者(可能是“xuy”)已经将...