创建Permission对象后如何处理它

时间:2014-03-19 17:19:48

标签: java file-io file-permissions

我需要将一些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。

所以我想知道我是否必须注册"这些权限对象在某处或某种程度上?

1 个答案:

答案 0 :(得分:1)

所以我最终扩展了PolicyPermissionCollection课程,在我的课程开始时,我打电话给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;
    }
}

然后在我的主程序中我刚刚执行Policy.setPolicy(new AwesomePolicy(inputPaths, processPaths));,其中inputPathsprocessPaths首先从数据库表中获取。