java 的 AccessController.doPrivileged使用

63 篇文章 0 订阅
13 篇文章 0 订阅

AccessController.doPrivileged意思是这个是特别的,不用做权限检查. 

在什么地方会用到呢:加入1.jar中有类可以读取一个文件,现在我们要使用1.jar去做这个事情.但是我们的类本生是没有权限去读取那个文件的,一般情况下就是眼睁睁的看着了.   

但是jiava提供了doPrivileged.在1.jar中如果读取文件的方法是通过doPrivileged来实现的.就不会有后面的检查了,现在我们就可以使用1.jar去读取那个文件了. 

例子: 

  1. package huangyunbin.client;  
  2.   
  3. import java.io.FilePermission;  
  4. import java.security.AccessController;  
  5. import java.security.Permission;  
  6. import java.security.PrivilegedAction;  
  7.   
  8. public class Client  
  9. {  
  10.     public   void  doCheck() {  
  11.                 AccessController.doPrivileged( new  PrivilegedAction()  {  
  12.             public  Object run()  {  
  13.                 check();  
  14.                 return   null ;  
  15.             }  
  16.         } );  
  17.     }  
  18.   
  19.     private   void  check()  {  
  20.         Permission perm  =   new FilePermission( "/1.txt" ,  "read" );  
  21.         AccessController.checkPermission(perm);  
  22.         System.out.println( " TestService has permission " );  
  23.     }  
  24. }  



把这个类打包成client.jar 放到/home/h/client/下 
我们建立个my.policy文件,文件内容是: 

  1. grant codeBase  "file:/home/h/client/*"   {  
  2.      permission java.io.FilePermission  "/1.txt","read";  
  3.  };  



配置文件的意思是 /home/h/client/下面的jar包或class类 可以读取/1.txt. 


现在我们再创建一个项目:创建一个类来调用前面的Client 

  1. public class server  
  2. {  
  3.     public static void main(String[] args)  
  4.     {  
  5.         Client c =new    Client();  
  6.         c.doCheck();  
  7.     }  
  8. }  



运行这个server类.注意这里要用上之前的my.policy文件 
在vm参数中写上这样的: 

  1. -Djava.security.manager   
  2. -Djava.security.policy=/home/h/my.policy  



运行,结果是 
TestService has permission 

在配置文件my.policy中我们没有允许server去读取/1.txt,但是现在却可以正常访问.这个就是 AccessController.doPrivileged的作用.

 

原文:http://huangyunbin.iteye.com/blog/1942509

### 回答1: accesscontroller.doprivilegedJava中的一个方法,用于执行受保护的代码块,需要具有特定的权限才能执行。这个方法可以在Java安全管理器中使用,以确保代码的安全性和可靠性。具体来说,它可以用于执行需要访问系统资源或执行敏感操作的代码,例如读取或写入文件、访问网络等。在执行受保护的代码块之前,需要使用AccessController类的doPrivileged方法来获取特定的权限,以确保代码的安全性和可靠性。 ### 回答2: accesscontroller.doprivilegedJava中的一个方法,它可以让Java程序在安全管理器的限制下执行特权操作,即允许程序访问受保护的资源。 当程序需要执行一些系统级任务时,例如读取系统属性或者操作文件系统等,通常需要使用特权操作。但是,在使用特权操作之前,程序需要获取安全管理器的相应权限。 accesscontroller.doprivileged方法可以帮助程序获取到这些权限,实现特权操作。当程序调用这个方法时,它可以在安全管理器的限制下执行受保护的操作,而不会触发安全异常。这个方法可以帮助程序在执行操作时,更加灵活和安全。 在使用accesscontroller.doprivileged方法时,需要注意以下几点: 1. 这个方法只能在Java安全管理器环境下执行。 2. 应该将要执行的代码块作为PrivilegedAction对象传递给这个方法,从而确保代码块在安全管理器环境下执行。 3. 在使用这个方法时,应该明确需要的权限,确保程序可以进行特权操作。 通过使用accesscontroller.doprivileged方法,Java程序可以更加方便地进行特权操作,同时确保程序安全性。 ### 回答3: AccessController.doPrivilegedJava中的一个授权机制,它允许开发人员在代码中指定一段受保护的代码,从而具有执行特权操作的能力。这个机制的作用是为了防止恶意代码或者其他不安全的代码获取系统中的敏感信息或者执行不允许的操作。 这个授权机制的工作原理是,当一段代码包含了AccessController.doPrivileged方法时,这段代码可以在一种受保护的环境下运行,获得执行特权操作的能力。在使用这个机制时,通过doPrivileged方法指定执行特权代码的具体逻辑,该方法接受一个PrivilegedAction对象作为参数,并且这个对象包含了执行所需的具体代码。 doPrivileged方法中还提供了一个重载版本,可以接受额外的参数,包括执行特权代码所需要的访问控制上下文、执行代码的类加载器等信息。这些参数可以让开发人员更加灵活地指定执行方式,保护代码的安全性。 最后,需要注意的是,AccessController.doPrivileged只有在代码签名正确并且信任链可靠的情况下才能起到有效的保护作用。如果代码签名出现问题或者信任链被破坏,那么使用这个机制的代码也可能会遭受攻击。因此,在使用这个机制时,需要加强代码签名和信任链的管理,以确保代码的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值