【问题标题】:What to do with a Permission object once it has been createdPermission 对象创建后如何处理
【发布时间】:2014-04-26 03:30:39
【问题描述】:

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

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

【问题讨论】:

  • 很可能你必须自己写SecurityManager
  • 不。我最终覆盖了PolicyPermissionCollection 类。很酷的事情是现在我可以完全摆脱我的策略文件,只需要即时生成我需要的权限。赢了。
  • 请回答您自己的问题。它将对许多其他人有用。 +1,如果你这样做。

标签: java file-io file-permissions


【解决方案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 首先是从数据库表中获取的。

【讨论】:

    猜你喜欢
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2017-03-11
    相关资源
    最近更新 更多