0

我的“全部拒绝”政策不会导致Eclipse SecurityExceptionRCP 部分。但是在普通的 java 类测试中可以正常工作 - checkPermissionthrows SecurityException

我正在使用带有implies方法的自定义策略。它拒绝所有具有任何主体的主体。检查是doAs在一些 RCP ViewPart 内部完成的。

查看部分。 设置我的策略,使用主体创建主题,为该主题运行 doAs 并检查权限:

public class MyPart extends ViewPart {
    public void createPartControl(Composite parent) {
        Policy.setPolicy(new MyPolicy());
        Subject subject = new Subject();
        subject.getPrincipals().add(new Principal() {
            public String getName() {
                return "MyPrincipal";
            }
        });
        Subject.doAs(subject, new PrivilegedAction<Object>() {
            @Override
            public Object run() {
                try {
                    AccessController.checkPermission(new MyPerm("abc"));
                }
                catch(SecurityException e) {
                    e.printStackTrace();
                }
                return null;

            }
        });
    }
}

政策。 拒绝对主体的所有操作的策略:

public class MyPolicy extends java.security.Policy {
    public boolean implies(ProtectionDomain domain, Permission permission) {
        if (domain.getPrincipals().length == 0) {
            //not inside of doAs
            return true;
        }

        System.out.println("deny all");
        return false;
    }
}

简单的测试许可:

public class MyPerm extends Permission {
    public MyPerm(String name) {
        super(name);
    }

    public boolean implies(Permission permission) {
        return false;
    }

    public boolean equals(Object o) {
        return false;
    }

    public int hashCode() {
        return 0;
    }

    public String getActions() {
        return null;
    }
}

在普通的 java 类测试和 Eclipse RCP 中,我都可以在控制台中看到“全部拒绝”字符串。因此,我的政策适用于这两种情况。

4

1 回答 1

0

未能使 JAAS 策略在 RCP 中正常工作。完成了肮脏的 hack 解决方法:AccessControlException从 Policy 返回 false 的地方直接扔掉。

例子:

public class MyPolicy extends java.security.Policy {
    public boolean implies(ProtectionDomain domain, Permission permission) {
        ...
        System.out.println("deny all");
        throw new AccessControlException("Access denied");
        return false;
    }
}
于 2013-06-24T10:05:53.627 回答