2012-04-09 2 views
1

JAAS auth를 사용하여 간단한 웹 응용 프로그램을 만들었습니다. 모두 제대로 작동하지만 서블릿에서 사용자의 역할 목록을 가져와야하지만 주제가 표시되지만 역할 목록 및 관련 주체가 반환되지 않습니다. 첫 번째 추가 된 주체 만 반환합니까? 왜 그렇습니까? 어떻게 역할을합니까? 여기Tomcat JAASRealm - 하나의 주체 만 반환합니다.

내 소스 :

AccLoginModule.java

public class AccLoginModule implements LoginModule { 
     public Subject subject; 
     private CallbackHandler callbackHandler; 
     private Map<String, ?> sharedState; 
     private Map<String, ?> options; 

     private AccPrincipal principal; 
     private boolean committed = false; 

     @Override 
     public boolean abort() throws LoginException { 
      System.out.println("abort"); 
      if (!committed) 
       return false; 
      if (principal != null) { 
       logout(); 
       principal = null; 
      } 
      return true; 
     } 

     @Override 
     public boolean commit() throws LoginException { 
      try { 
       if (subject.getPrincipals().size() == 0) { 
        subject.getPrincipals().add(new AccPrincipal("principal 1")); 
        subject.getPrincipals().add(new AccPrincipal("principal 2")); 
        subject.getPrincipals().add(new AccRole("Acc User")); 
        subject.getPrincipals().add(new AccRole("Acc User1")); 
       } 
       return true; 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return false; 
      } 
     } 

     @Override 
     public boolean login() throws LoginException { 
      // System.out.println("login"); 

      if (callbackHandler == null) 
       throw new LoginException("No CallbackHandler specified"); 
      Callback callbacks[] = new Callback[2]; 
      callbacks[0] = new NameCallback("Username: "); 
      callbacks[1] = new PasswordCallback("Password: ", false); 

      // Interact with the user to retrieve the username and password 
      String username = null; 
      String password = null; 
      try { 
       callbackHandler.handle(callbacks); 
       username = ((NameCallback) callbacks[0]).getName(); 
       password = new String(((PasswordCallback) callbacks[1]).getPassword()); 
       return true; 
      } catch (Exception e) { 
       throw new LoginException(e.toString()); 
      } 
     } 

     @Override 
     public boolean logout() throws LoginException { 
      System.out.println("logout"); 
      committed = false; 
      subject.getPrincipals().remove(principal); 

      return false; 
     } 

     @Override 
     public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) { 
      this.subject = subject; 
      this.callbackHandler = callbackHandler; 
      this.sharedState = sharedState; 
      this.options = options; 

     } 

     public Subject getSubject() { 
      return subject; 
     } 

     public void setSubject(Subject subject) { 
      this.subject = subject; 
     } 

    } 

AccPrincipal

public class AccPrincipal implements Principal, Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 5002820876845306935L; 

    private final String loginResponse; 

    public AccPrincipal(String lr) { 
     this.loginResponse=lr; 
    } 

    @Override 
    public String getName() { 
     return loginResponse; 
    } 

    public String getLoginResponse() { 
     return loginResponse; 
    } 

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

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

AccRole

public class AccRole implements Principal, Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 2764250372647034496L; 
    private String name; 

    public AccRole(String name){ 
     this.name = name; 
    } 


    @Override 
    public String getName() { 
     return name; 
    } 


    public void setName(String name) { 
     this.name = name; 
    } 


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


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


} 

의 context.xml

<Context> 
    <Realm className="org.apache.catalina.realm.JAASRealm" appName="acczk" 
     userClassNames="com.laws.acc.jaas.AccPrincipal" 
     roleClassNames="com.laws.acc.jaas.AccRole"> 
    </Realm> 

</Context> 

MyServlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     final Subject subject = Subject.getSubject(AccessController.getContext()); 
     for (Principal princ : subject.getPrincipals()) { 
      System.out.println(princ.getName()); 
     } 
    } 

콘솔 :

09.04.2012 17:11:29 org.apache.catalina.startup.Catalina start 
INFO: Server startup in 1385 ms 
principal 1 

나는 모든 실체 주체 (교장 + 역할)을 얻을 수 있습니까? 내가 뭘 잘못하고 있니?

+0

더 많은 코드를 입력하십시오. –

+0

Tomcat 버전을 참조하십시오. –

+0

Tomvat 버전 6.0.29 – Akvel

답변

1

Tomcat과 Java EE는 일반적으로 그렇게 작동하지 않습니다. 당신은 당신이 그것을하고있는 방식으로 주제에 접근 할 수 없다.

전체 설명은이 답변을 참조하십시오. Tomcat-Jaas - How to retrieve subject?

관련 문제