实现权限类

当你想对Java程序进行权限控制时,可以考虑启用SecurityManager安全管理器,并配置XX.policy文件来达到你想的效果。(想对安全管理器进一步了解,可以阅读《深入Java虚拟机》)
1.启动SecurityManager开关
默认情况下,JVM是不启动安全检查的,所以要想让程序在沙箱中运行,必须将开关打开。打开的方式有两种,一种是在启动运行中追加JVM参数 -Djava.security.manager,还有一种方式是在程序中直接设置:System.setSecurityManager(new SecurityManager());,这两种方式是等价的。
2.JVM自带的java.policy文件

Java.policy文件位于%JAVA_HOME%/ jre/lib/security/下,默认内容如下:

[java]  view plain  copy
  1. // Standard extensions get all permissions by default  
  2.    
  3. grant codeBase "file<img src="%5C%22static/image/smiley/default/shy.gif%5C%22" smilieid="\"8\"" alt="\"\"" border="\"0\"">{{java.ext.dirs}}/*" {  
  4.         permission java.security.AllPermission;  
  5. };  
  6.    
  7. // default permissions granted to all domains  
  8.    
  9. grant {   
  10.         // Allows any thread to stop itself using the java.lang.Thread.stop()  
  11.         // method that takes no argument.  
  12.         // Note that this permission is granted by default only to remain  
  13.         // backwards compatible.  
  14.         // It is strongly recommended that you either remove this permission  
  15.         // from this policy file or further restrict it to code sources  
  16.         // that you specify, because Thread.stop() is potentially unsafe.  
  17.         // See "http://java.sun.com/notes" for more information.  
  18.         permission java.lang.RuntimePermission "stopThread";  
  19.    
  20.         // allows anyone to listen on un-privileged ports  
  21.         permission java.net.SocketPermission "localhost:1024-""listen";  
  22.    
  23.         // "standard" properies that can be read by anyone  
  24.    
  25.         permission java.util.PropertyPermission "java.version""read";  
  26.         permission java.util.PropertyPermission "java.vendor""read";  
  27.         permission java.util.PropertyPermission "java.vendor.url""read";  
  28.         permission java.util.PropertyPermission "java.class.version""read";  
  29.         permission java.util.PropertyPermission "os.name""read";  
  30.         permission java.util.PropertyPermission "os.version""read";  
  31.         permission java.util.PropertyPermission "os.arch""read";  
  32.         permission java.util.PropertyPermission "file.separator""read";  
  33.         permission java.util.PropertyPermission "path.separator""read";  
  34.         permission java.util.PropertyPermission "line.separator""read";  
  35.    
  36.         permission java.util.PropertyPermission "java.specification.version""read";  
  37.         permission java.util.PropertyPermission "java.specification.vendor""read";  
  38.         permission java.util.PropertyPermission "java.specification.name""read";  
  39.    
  40.         permission java.util.PropertyPermission "java.vm.specification.version""read";  
  41.         permission java.util.PropertyPermission "java.vm.specification.vendor""read";  
  42.         permission java.util.PropertyPermission "java.vm.specification.name""read";  
  43.         permission java.util.PropertyPermission "java.vm.version""read";  
  44.         permission java.util.PropertyPermission "java.vm.vendor""read";  
  45.         permission java.util.PropertyPermission "java.vm.name""read";  
  46. };  

里面定义了JAVA程序默认的权限,第一个grant定义了系统属性${{java.ext.dirs}}路径下的所有的class及jar(/* 号表示所有class和jar,如果只是/则表示所有class但不包括jar)拥有所有的操作权限 (java.security.AllPermission),java.ext.dirs对应路径为%JAVA_HOME%/jre/lib/ext目 录,而第二个grant后面定义了所有JAVA程序都拥有的权限,包括停止线程、启动Socket 服务器、读取部分系统属性。相信从字面上大家也能读懂其含义。

3.先写个测试例子:JavaPolicyTest.java(将其放在C:/TEMP目录下)

[java]  view plain  copy
  1. import java.io.BufferedReader;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.FileWriter;  
  5. import java.io.InputStream;  
  6. import java.io.InputStreamReader;  
  7.    
  8. public class JavaPolicyTest {  
  9.         public static void main(String[] args) {  
  10.                 File file = new File("D:/test.txt");  
  11.                 try {  
  12.                         read(file);  
  13.                         System.out.println("file read ok");  
  14.                 } catch (Throwable e) {  
  15.                         System.out.println(e.getMessage());  
  16.                 }  
  17.    
  18.                 try {  
  19.                         write(file);  
  20.                         System.out.println("file write ok");  
  21.                 } catch (Throwable e) {  
  22.                         System.out.println(e.getMessage());  
  23.                 }  
  24.         }  
  25.    
  26.         private static void read(File file) throws Throwable {  
  27.                 InputStream in = null;  
  28.                 BufferedReader reader = null;  
  29.                 try {  
  30.                         in = new FileInputStream(file);  
  31.                         reader = new BufferedReader(new InputStreamReader(in));  
  32.                         String temp = null;  
  33.                         while ((temp = reader.readLine()) != null) {  
  34.                                 System.out.println("read-->" + temp);  
  35.                         }  
  36.                 } catch (Throwable e) {  
  37.                         throw e;  
  38.                 } finally {  
  39.                         if (in != null) {  
  40.                                 in.close();  
  41.                         }  
  42.                         if (reader != null) {  
  43.                                 reader.close();  
  44.                         }  
  45.                 }  
  46.         }  
  47.    
  48.         private static void write(File file) throws Throwable {  
  49.                 FileWriter fw = new FileWriter(file);  
  50.                 for (int i = 0; i < 10; i++) {  
  51.                         String temp = new java.util.Date() + " "  
  52.                                         + new java.util.Random().nextLong();  
  53.                          System.out.println("write-->" + temp);  
  54.                         fw.write(temp + "\r\n");  
  55.                 }  
  56.                 fw.flush();  
  57.                 fw.close();  
  58.         }  
  59. }  

在这个类中,我们将对D:/test.txt的文件进行访问,在C:/temp目录用命令行下执行java JavaPolicyTest,可以看到,操作都可以成功。但如果,我们启动了安全管理器时,访问是不成功的。
执行java -Djava.security.manager JavaPolicyTest时,可以看到访问是被拒绝的:
access denied (java.io.FilePermission D:\test.txt read)
access denied (java.io.FilePermission D:\test.txt write)
很明显,由于我们启动了安全检查,这里的操作全部失败。
4.自定义my.policy文件(进行访问仅限控制)
在c:/temp目录下写my.policy文件:

[java]  view plain  copy
  1. grant codeBase "file:/C:/TMP/*" {  
  2.     permission java.security.AllPermission;  
  3. };  

该文件的含义是:位置C:/TEMP目录下的Java程序拥有所有访问权限。
此时,进行测试:
输入命令:java -Djava.security.manager -Djava.security.policy=my.policy JavaPolicyTest

可以看到操作成功:
read-->Fri Jun 29 09:09:03 CST 2012 8306741991113651384
read-->Fri Jun 29 09:09:03 CST 2012 3858861688401833822
read-->Fri Jun 29 09:09:03 CST 2012 1200273480130160113
read-->Fri Jun 29 09:09:03 CST 2012 8757841849132885969
read-->Fri Jun 29 09:09:03 CST 2012 2706431524346322515
read-->Fri Jun 29 09:09:03 CST 2012 3338209174819526164
read-->Fri Jun 29 09:09:03 CST 2012 4303567693339900976
read-->Fri Jun 29 09:09:03 CST 2012 246564543183403482
read-->Fri Jun 29 09:09:03 CST 2012 -5613827692140751148
read-->Fri Jun 29 09:09:03 CST 2012 -2160324389603373039
file read ok
write-->Fri Jun 29 09:41:33 CST 2012 -4466633047452156168
write-->Fri Jun 29 09:41:33 CST 2012 6002365139178242241
write-->Fri Jun 29 09:41:33 CST 2012 -7638920310528629538
write-->Fri Jun 29 09:41:33 CST 2012 5167349606741454313
write-->Fri Jun 29 09:41:33 CST 2012 2958827128287814608
write-->Fri Jun 29 09:41:33 CST 2012 -5743066306268526126
write-->Fri Jun 29 09:41:33 CST 2012 -7794828514725883971
write-->Fri Jun 29 09:41:33 CST 2012 7382498395857317067
write-->Fri Jun 29 09:41:33 CST 2012 7040217825519914232
write-->Fri Jun 29 09:41:33 CST 2012 -1544415070373588605
file write ok
由于我分配的是AllPermission,所以全部操作都能成功。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值