关于Jaas中的Subject.doAsPrivileged()方法的问题

[复制链接]
查看11 | 回复0 | 2009-1-30 06:28:38 | 显示全部楼层 |阅读模式
最近在看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()试一试,若你程序没错的话,应该没有权限的.                                       
提问者对答案的评价:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行