【问题标题】:How to subclass BasicPermission to add actions如何继承 BasicPermission 以添加操作
【发布时间】:2015-05-31 07:24:15
【问题描述】:

我想创建一个 BasicPermission 的子类来添加操作,根据 java 文档,这应该是可能的:

如果需要,子类可以在 BasicPermission 之上实现操作。

这是我最初的尝试:

public class BasicPermissionWithActions extends BasicPermission {

String        actions;
String[]      actionList;
String        name;

public BasicPermissionWithActions(String name, String actions) {
    super(name, actions);
    this.actions = actions;
    this.actionList = actions.split("\\,");
    this.name = name;
}

private static final long serialVersionUID = 7608854273379948062L;

@Override
public boolean implies(Permission p) {
    // name and class check can be done by super
    if (!super.implies(p))
        return false;

    // now check actions
    String requestedActions = p.getActions();
    String[] requestedActionList = requestedActions.split("\\,");
    for (String requestedAction : requestedActionList) {
        if (!hasRequestedAction(requestedAction))
            return false;
    }

    return true;
}

private boolean hasRequestedAction(String requestedAction) {
    for (String action : actionList) {
        if (action.equals(requestedAction))
            return true;
    }
    return false;
}

@Override
public String getActions() {
    return actions;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = super.hashCode();
    result = prime * result + ((actions == null) ? 0 : actions.hashCode());
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (!super.equals(obj))
        return false;
    if (getClass() != obj.getClass())
        return false;
    BasicPermissionWithActions other = (BasicPermissionWithActions) obj;
    if (actions == null) {
        if (other.actions != null)
            return false;
    } else if (!actions.equals(other.actions))
        return false;
    if (name == null) {
        if (other.name != null)
            return false;
    } else if (!name.equals(other.name))
        return false;
    return true;
}

@Override
public String toString() {
    return "(\"" + this.getClass().getName() + "\" \"" + name + "\" \"" + actions + "\")"; 
}

并且在策略文件中使用此权限授予访问权限(在这种情况下,我指定的权限应该不足以允许所需的操作):

grant principal sample.principal.SampleGroup "TestGroup" {
  permission BasicPermissionWithActions "*", "read";
};

以及检查权限的代码:

        rep.getAccessControlContext().checkPermission(new BasicPermissionWithActions(getName(), "write"));

我预计此检查会失败,因为该策略仅指定了读取操作。但是检查悄悄地通过了。

问题在于,只要策略文件中的权限名称为“*”,就永远不会检查操作。在调试模式下运行表明 BasicPermissionWithActions.implies 方法从未被调用过。

如果我从策略文件中省略了权限,我会得到预期的安全异常,但我无法执行操作。

【问题讨论】:

    标签: java security permissions jaas


    【解决方案1】:

    问题与 PermissionCollection 有关。 BasicPermission 实现了自己的 PermissionCollection 以获得更好的性能。不幸的是,这个实现做了一些简化的假设,破坏了子类的语义。具体来说,它实现了“*”的快捷方式,绕过 Permission.implies 方法并始终返回 true。

    解决方案是实现一个自定义 PermissionCollection,它只调用其成员的 Permission.implies 方法:

        private class CustomPermissionCollection extends PermissionCollection {
    
        private static final long serialVersionUID = 5654758059940546018L;
    
        Collection<Permission> perms = new ArrayList<Permission>();
    
        @Override
        public void add(Permission permission) {
            perms.add(permission);
        }
    
        @Override
        public boolean implies(Permission permission) {
            for (Permission p : perms) {
                if (p.implies(permission))
                    return true;
            }
            return false;
        }
    
        @Override
        public Enumeration<Permission> elements() {
            return Collections.enumeration(perms);
        }
    
    }
    

    并在 BasicPermissionWithActions 的 newPermissionCollection 方法中返回它

    @Override
    public PermissionCollection newPermissionCollection() {
        return new CustomPermissionCollection();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多