Java 权限对象创建后如何处理

Java 权限对象创建后如何处理,java,file-io,file-permissions,Java,File Io,File Permissions,我需要向几个目录授予一些java.io.FilePermissions。这些目录是从数据库表中获取的,因此我不想在策略文件中设置这些特定权限 我的应用程序中有以下代码: FilePermission permission1 = new FilePermission(inputDir+File.separatorChar+"*", "read, write"); FilePermission permission2 = new FilePermission(processDir+File.sepa

我需要向几个目录授予一些java.io.FilePermissions。这些目录是从数据库表中获取的,因此我不想在策略文件中设置这些特定权限

我的应用程序中有以下代码:

FilePermission permission1 = new FilePermission(inputDir+File.separatorChar+"*", "read, write");
FilePermission permission2 = new FilePermission(processDir+File.separatorChar+"*", "read, write");
但是当我的应用程序尝试将文件从
inputDir
移动到
processDir
时,我会继续得到java.security.AccessControlException


所以我想知道我是否必须在某处或以某种方式“注册”这些权限对象

因此,我最终扩展了
Policy
PermissionCollection
类,并在程序开始时调用了
Policy.setPolicy()
。本质上,这为您提供了设置某些策略的代码方式。我不知道它在一般情况下是否有用,但它对我很有用,因为我想授予
java.io.FilePermission
特定目录,这些目录可能会随着时间的推移而改变

无论如何,这里有一些代码来演示我所做的:

public class AwesomePolicy extends Policy {
    private PermissionCollection myPermissions;
    private List<Path> inputPaths;
    private List<Path> processPaths;

    public AwesomePolicy(List<Path> inputPaths, List<Path> processPaths){
        this.inputPaths=inputPaths;     // shallow copy
        this.processPaths=processPaths; // shallow copy
        myPermissions = new AwesomePermissionCollection();
        populateAwesomePermissionCollection();
    }

    @Override
    public PermissionCollection getPermissions(CodeSource codesource){
    return permissions;
    }

    private void populateAwesomePermissionCollection(){
        for(Path p : inputPaths){
            myPermissions.add(new FilePermission(p.toString() + File.separatorChar + "*", "read, write");

        for(Path p: processPaths){
            myPermissions.add(new FilePermission(p.toString() + File.separatorChar + "*", "read, write");
    }
  }
}


public AwesomePermissionCollection extends PermissionCollection{

     private static final long serialVersionUID = -7456927975079431927L;

     List<Permission> myPermissions = new ArrayList<Permission>();

    @Override
    public void add(Permission p){
        myPermissions.add(p);
    }

    @Override
    public Enumeration<Permission> elements(){
        return Collections.enumeration(myPermissions);
    }

    @Override
    public boolean implies(Permission permission){
        for(Permission p: myPermissions){
            if(p.implies(permission)){
                return true; 
            }
        }
            return false;
    }
}
公共类AwesomePolicy扩展策略{
私有权限收集权限;
私有列表输入路径;
私有列表处理路径;
公共AwesomePolicy(列表输入路径、列表处理路径){
this.inputPaths=inputPaths;//浅复制
this.processpath=processpath;//浅复制
myPermissions=new AwesomePermissionCollection();
PopulateWesomePermissionCollection();
}
@凌驾
公共权限集合getPermissions(CodeSource CodeSource){
返回权限;
}
私有void populateAwesomePermissionCollection(){
用于(路径p:输入路径){
添加(新文件权限(p.toString()+File.separatorChar+“*”,“读、写”);
用于(路径p:ProcessPath){
添加(新文件权限(p.toString()+File.separatorChar+“*”,“读、写”);
}
}
}
公共AwesomePermissionCollection扩展了PermissionCollection{
私有静态最终长serialVersionUID=-7456927975079431927L;
List myPermissions=new ArrayList();
@凌驾
公共作废添加(权限p){
myPermissions.add(p);
}
@凌驾
公共枚举元素(){
返回集合。枚举(myPermissions);
}
@凌驾
公共布尔暗示(权限){
用于(权限p:myPermissions){
如果(p.暗示(许可)){
返回true;
}
}
返回false;
}
}

然后在我的主程序中,我只做了
Policy.setPolicy(新的AwesomePolicy(inputpath,processpath))
其中
输入路径
处理路径
是首先从数据库表中获取的。

很可能您必须编写自己的
安全管理器
不。我最终覆盖了
策略
权限集合
类。现在最酷的事情是我可以完全摆脱我的策略只需动态生成我需要的权限即可。赢。请回答您自己的问题。这将对其他许多人有用。+1如果您这样做。