2013-06-19 4 views
0

내 모든 "거부"정책은이 이 아니며 Eclipse RCP 부분에 SecurityException이 발생합니다. 하지만 평범한 자바 클래스 테스트에서 제대로 작동합니다 - checkPermissionSecurityException을 던졌습니다.Eclipse RCP의 JAAS 정책

implies 방법으로 맞춤 정책을 사용하고 있습니다. 교장이있는 모든 과목을 거부합니다. 일부 RCP ViewPart에서 doAs 내부에서 확인이 수행됩니다.

ViewPart.

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; 

      } 
     }); 
    } 
} 

정책 : 그 주제에 대한의 doAs를 실행하고 권한을 확인하는 교장과 주제 작성설정 내 정책을. 시험

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; 
    } 
} 

모두 일반 자바 클래스 테스트 및 이클립스 RCP에서, 나는 "를 볼 수 있습니다 콘솔에서 ""문자열을 모두 거부합니다. 따라서 두 가지 경우 모두 내 정책이 적용됩니다.

답변

0

RCP에서 JAAS Policy가 제대로 작동하지 못했습니다. 더러운 해킹 해결 방법으로 끝냈습니다. 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; 
    } 
}