`

jvm_8_自定义安全管理器简易demo

    博客分类:
  • jvm
 
阅读更多

 

 

前言:

安全管理器和类装载器都可以自定义,安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比描上述描述要复杂得多,这里仅仅举个例子,

有个形象思维。

 

实现:

 

第一步,定义一个类继承自SecurityManger重写它的checkRead方法:

public class MySecurityManager extends SecurityManager {

	@Override
	public void checkRead(String file) {
		//super.checkRead(file, context);
		if (file.endsWith("test"))  
	    throw new SecurityException("你没有读取的本文件的权限");  
	}
	
}

 

第二步,定义一个有main函数的public类来验证自己的安全管理器是不是器作用了。

 

import java.io.FileInputStream;
import java.io.IOException;

public class TestMySecurityManager {
	public static void main(String[] args) {
		System.setSecurityManager(new MySecurityManager());
		try {
			FileInputStream fis = new FileInputStream("test");
			System.out.println(fis.read());
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}

 

 第三步,运行代码查看控制台输出:

java.lang.SecurityException: 你没有读取的本文件的权限
	at MySecurityManager.checkRead(MySecurityManager.java:7)
	at java.io.FileInputStream.<init>(Unknown Source)
	at java.io.FileInputStream.<init>(Unknown Source)
	at TestMySecurityManager.main(TestMySecurityManager.java:10)

  

 上面的异常我们发现,安全管理器起作用了, 在 《 jvm_7_安全管理器简介》中使用的是-Djava.security.manager安装过默认的安全管理器, 这里使用自定义安全器。

 

拓展内容

 

为何要重写checkRead方法呢? 看下面代码即可知:

 public FileInputStream(File file) throws FileNotFoundException {
	String name = (file != null ? file.getPath() : null);
	SecurityManager security = System.getSecurityManager();
	if (security != null) {
	    security.checkRead(name);
	}
        if (name == null) {
            throw new NullPointerException();
        }
	fd = new FileDescriptor();
	open(name);
    }

文件流创建时候先 执行SecurityManager security = System.getSecurityManager();,然后再调用security的checkRead方法, 因此上面 重写了checkRead方法。

 

SecurityManager 的应用很广,如下案例(java的File.setWritable方法), 下面就使用了SecurityManager的checkWrite方法,如果我们想通过checkWrite验证自定义安全管理器是否应用到类中时, 还需要重写 checkWrite方法

    public boolean setWritable(boolean writable, boolean ownerOnly) {
	SecurityManager security = System.getSecurityManager();
	if (security != null) {
	    security.checkWrite(path);
	}
	return fs.setPermission(this, FileSystem.ACCESS_WRITE, writable, ownerOnly);
    }

 

 

分享到:
评论

相关推荐

    tomcat 启动:Address already in use: JVM_Bind <null>:8080

    接下来,打开任务管理器,选择“查看”--&gt;“选择列”--&gt;“PID”,然后找到该 PID 的进程。最后,结束该进程,释放端口 8080。 为什么 Tomcat 需要使用端口 8080?这是因为 Tomcat 默认情况下监听端口 8080,以便...

    linux nginx nginx_upstream_jvm_route

    linux nginx nginx_upstream_jvm_route

    练习JVM调优-jvm_demo.zip

    "练习JVM调优-jvm_demo.zip"是一个压缩包,包含了用于JVM调优实践的示例项目"jvm_demo-master"。通过这个项目,我们可以深入学习和理解JVM的工作原理和调优技术。 1. **JVM结构与工作原理**: - 类加载器:加载、...

    inside_jvm.rar_Inside the JVM_gettingloaded.html_inside jvm_insi

    《深入理解JVM》(Inside the JVM) 是一本关于Java虚拟机的重要参考资料,它涵盖了JVM的内部工作原理,包括类加载机制、内存管理、字节码执行等核心概念。"gettingloaded.html" 可能是其中的一个章节,专门探讨了类的...

    jvm_jvm新手_jvm_

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。作为新手,了解JVM的工作原理和优化技巧是成为熟练Java开发者的重要步骤。以下是一些关于JVM的关键知识点: 1. **内存区域...

    java.net.BindException: Address already in use: JVM_Bind :8088(端口冲突)

    在myeclipse中将html文件改成jsp文件时myeclipse卡住;将之前的任务关掉;再打开时多次部署项目的时候报错

    jvm.zip_jvm_knownobc_tomcat

    在Java 8及以后的版本中,永久代被元空间取代,理解这两个区域的区别和设置对内存管理同样重要。元空间的大小可以通过`-XX:MetaspaceSize`和`-XX:MaxMetaspaceSize`进行控制。 7. **类加载器优化**: Tomcat中的...

    JVM.rar_jvm_jvm 实现

    总结来说,"JVM.rar_jvm_jvm 实现"项目是一个简化版的Java虚拟机实现,重点关注了基本的字节码解析、操作数栈的管理、加减运算和跳转控制。这个项目对于学习JVM的内部工作机制以及Java代码如何被解释执行非常有帮助...

    JVM.rar_java 工作流_java 虚拟机_jvm_jvm hook_虚拟机 Java

    "深入Java虚拟机"这本书可能涵盖了JVM的更深入细节,如类加载机制的自定义、内存模型、垃圾收集器的原理与调优、JVM参数设置、性能监控工具的使用等。通过学习这些内容,开发者可以更好地理解和优化Java应用的运行...

    JVM_启动参数_总结

    JVM_启动参数_总结。详细介绍JVM的详细启动参数及JVM垃圾回收机制。

    JVM_GC调优

    通过对JVM_GC调优的深入探讨,我们可以看出JVM内存管理和垃圾回收机制的复杂性。合理的GC策略和参数调整对于提高Java应用的性能至关重要。理解不同GC算法的特点和适用场景,可以帮助开发者选择最适合特定应用场景的...

    jvm_gc.rar_jvm_垃圾回收

    垃圾回收是JVM自动管理内存的过程,其目标是回收不再使用的对象所占用的空间,防止内存泄漏。 1. ** Minor GC**:针对年轻代的垃圾回收,主要清理Eden区和一个Survivor区。当Eden区满时,会触发Minor GC,将存活的...

    CCallJava.rar_c++ jvm_java dll_jvm_jvm.dll_vc jvm.dll

    VC调用java的简单例子。需要注意jvm.dll路径,路径不对就不能成功!

    Java_Jvm_Jsp_Spring3_Struts2_Hibernate_Oracle _

    Java_Jvm_Jsp_Spring3_Struts2_Hibernate_Oracle _

    nginx-upstream-jvm-route-1.6.tar.gz

    nginx_upstream_jvm_route 是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。 安装方法(进入Nginx源码目录): #patch -p0 &lt; /path/to/this/directory/jvm_route.patch # ./configure -...

    jvm_code深入理解.zip

    1. 类装载器:类装载器负责加载.class文件到JVM中,分为引导类装载器、扩展类装载器和应用类装载器,以及用户自定义的类装载器。了解类装载过程(加载、验证、准备、解析和初始化)对于理解类的生命周期至关重要。 ...

    JVM.zip_java jvm_jvm

    总的来说,"JVM.zip"提供的资源对于任何Java开发者来说都是有价值的,它帮助我们更好地理解和管理Java应用程序在JVM上的运行状态,从而实现更高效、更稳定的系统性能。通过深入学习和利用这些工具,开发者能够提升...

    nginx-upstream-jvm-route-1.15

    总的来说,"nginx-upstream-jvm-route-1.15"是一个针对Nginx 1.15版本的解决方案,它允许用户通过upstream模块更灵活地管理与JVM应用服务器的交互,并解决了配置过程中可能出现的特定错误。通过深入理解和应用该项目...

    rules_jvm_external:用于解析,获取和导出Maven工件的Bazel规则

    目录产品特点WORKSPACE配置JAR,AAR,源JAR 自定义Maven存储库具有HTTP基本身份验证的私有Maven存储库使用Coursier的工件版本解析与Bazel的下载器和缓存机制集成,可在Bazel工作区之间共享工件将已解析的工件及其SHA...

    jvm_session_demo:jvm 会话演示

    【标题】"jvm_session_demo:jvm 会话演示"主要关注的是Java虚拟机(JVM)在处理会话管理中的应用。会话是Web应用程序中一个关键的概念,它允许服务器跟踪用户的状态和行为,特别是在状态无状态的HTTP协议中。JVM在此...

Global site tag (gtag.js) - Google Analytics