最近在看Jaas,有个问题始终搞不明白,希望了解Jaas的大哥们给点提示.我在调用Jaas的Subject.doAsPrivileged(Subject subject, PrivilegedAction action, AccessControlContext acc) 的方法的时候,为什么对于我授予当前运行代码的权限,比如FilePermission( "c:/tmp/test", "read"),这个未授予此文件读权限的subject也会检查通过?我的相关部分的代码是:**********************************************************************************************final FilePermission filePerm = new FilePermission(
"c:/tmp/test", "read"); try{ Subject.doAsPrivileged(subj, new PrivilegedAction<Object>() { public Object run() { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(filePerm); } return null; } }, null); }catch(SecurityException e){ allowed = false; Debug.printException(e); }catch(Exception e){ allowed = false; Debug.printException(e); } System.out.println("result: "+allowed);***********************************************************************************************我的部分Policy(系统默认的Policy文件)的配置文件:其中 codeBase "file:///G:/common/WorkRegion/Jaas/bin" 是我的代码的位置.***********************************************************************************************grant codeBase "file:///G:/common/WorkRegion/Jaas/bin" { permission javax.security.auth.AuthPermission "*" ; permission java.util.PropertyPermission "*" , "read"; permission java.io.FilePermission "<<ALL FILES>>", "read,write,execute,delete"; permission java.lang.RuntimePermission "accessClassInPackage.sun.security.provider"; permission java.lang.RuntimePermission "getProtectionDomain"; //permission java.security.AllPermission;};***********************************************************************************************除了用系统的默认Policy外,我在程序中还有自己的部分Policy实现,我只是在我自己实现的Policy类里面简单的把系统Policy授予的权限叠加.下面是我实现的Policy的部分代码:***********************************************************************************************public boolean implies(final ProtectionDomain domain, final Permission permission) {
Debug.println(this,"CodeSource: "+domain.getCodeSource().getLocation().toString()); //简单调用我实现的policy和系统默认的Policy \'sun.security.provider.PolicyFile\'的implies方法在这个系统正在使用的Policy中,其中任何一个Policy的implies调用成功则返回true. for (Policy p: this.policies) { if (p.implies(domain, permission)) { return true; } }
return false;}***********************************************************************************************下面是我摘录Java API帮助的关于Subject.doAsPrivileged方法的部分.***********************************************************************************************doAsPrivilegedpublic static Object doAsPrivileged(Subject subject,
PrivilegedAction action,
AccessControlContext acc)Perform privileged work as a particular Subject. This method behaves exactly as Subject.doAs, except that instead of retrieving the current Thread\'s AccessControlContext, it uses the provided AccessControlConte
你的doAsPrivileged函数的最后一个参数是null,当然什么保护都没有了.这是文档中的后面几句:If the provided AccessControlContext is null, this method instantiates a new AccessControlContext with an empty collection of ProtectionDomains.由于你传递null到doAsPrivileged函数的第三个参数,则用与用户身份相关联的服务器端调用堆栈 ProtectionDomain 进行权限检查。而在服务器端它不管你有没有授予权限给subject,他直接看他的Policy文件内容,而恰好包含文件的读权限,所以无声的检查通过了.除非你将你的AccessControlContext传进去第三参数.你将第三参数换成AccessController.getContext()试一试,若你程序没错的话,应该没有权限的.
提问者对答案的评价: |