java 的 AccessController.doPrivileged使用

本文介绍了Java中的AccessController.doPrivileged方法,该方法允许特定代码段绕过常规的安全检查进行敏感操作,如文件读取。通过示例展示了如何利用此特性使原本无权限的类能够执行受限操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

例子:

Java代码   收藏代码
  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文件,文件内容是:

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



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


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

Java代码   收藏代码
  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参数中写上这样的:

Java代码   收藏代码
  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

推荐文章:Java 安全模型介绍

2025-03-07 12:49:56.965+0000 [id=1] SEVERE hudson.util.BootFailure#publish: Failed to initialize Jenkins java.lang.NullPointerException: Cannot load from short array because "sun.awt.FontConfiguration.head" is null at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1262) at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:224) at java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:106) at java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:706) at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:358) at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:315) at java.base/java.security.AccessController.doPrivileged(AccessController.java:318) at java.desktop/sun.font.SunFontManager.<init>(SunFontManager.java:315) at java.desktop/sun.awt.FcFontManager.<init>(FcFontManager.java:35) at java.desktop/sun.awt.X11FontManager.<init>(X11FontManager.java:56) Caused: java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:85) Caused: java.lang.InternalError at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:87) at java.base/java.security.AccessController.doPrivileged(AccessController.java:318) at java.desktop/sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:75) at java.desktop/java.awt.Font.getFont2D(Font.java:526) at java.desktop/java.awt.Font.getFami
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值