2014-01-11 3 views
0

사용자가 프로필에 연결하는 웹 애플리케이션이 있습니다.JAAS로 인증

보호 된 자원 (이 경우 profile.xhtml 페이지)을 요청할 때 JAAS를 사용하여 사용자를 인증 할 수 있습니다.

인증이 완료되면 프로필 페이지에 액세스 할 수 있습니다. 이는 분명 비어 있습니다 (데이터가 데이터베이스에서 전송되지 않음).

내 문제는 다음과 같습니다. 인증 후 적절한 프로필 (이 사용자 정보가 가득)을 제공하는 방법을 알 수 없습니다. 즉 :

1) 로그인 모듈에서 내 프로필 페이지로 사용자 이름 (이 테이블 사용자의 ID)을 어떻게 잡아낼 수 있습니까?

2) 사용자 튜플의 정보를 제공된 JSF 페이지에 넣어 사용자에게 렌더링 할 수있는 방법은 무엇입니까?

이 내 로그인 모듈 (긴 조금 그래서 그냥 로그인 방법 컷)입니다 : 이것은 profile.xhtml 페이지를 요청 후 팝업 내 양식 인증

@Override 
public boolean login() throws LoginException { 

    if (callbackHandler == null) { 
     throw new LoginException("Error: no CallbackHandler available " 
       + "to garner authentication information from the user"); 
    } 
    Callback[] callbacks = new Callback[2]; 
    callbacks[0] = new NameCallback("username"); 
    callbacks[1] = new PasswordCallback("password: ", false); 

    try { 

     callbackHandler.handle(callbacks); 
     username = ((NameCallback) callbacks[0]).getName(); 
     password = ((PasswordCallback) callbacks[1]).getPassword(); 

     if (debug) { 
      System.out.println("Username :" + username); 
      System.out.println("Password : " + password); 
     } 

     if (username == null || password == null) { 
      System.out.println("Callback handler does not return login data properly"); 
      throw new LoginException(
        "Callback handler does not return login data properly"); 
     } 

     if (isValidUser()) { // validate user. 
      Profile profile = new Profile(); 
      profile.setUsername(username); 
      succeeded = true; 

      return true; 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (UnsupportedCallbackException e) { 
     e.printStackTrace(); 
    } 

    return false; 
} 

입니다 (나는이 규칙을 구성 web.xml에) :

<form method=post action="j_security_check"> 
    <p> 
     <span>Username:</span> <br /> <input type="text" name="j_username"> 
    </p> 
    <p> 
     <span>Password:</span> <br /> <input type="password" 
      name="j_password"> 
    </p> 
    <p> 
     <input type="submit" value="Login"> 
    </p> 
</form> 

그리고는이 페이지에 대한 ManagedBean은이다 "profile.java"에 관련된 내 프로필의 JSF 페이지의 일부입니다. 나는 그가 JSF 페이지를 프로필에 인증 후 정보를 얻고 ManagedBean은에 넣어 그것을 제공하는 방법을 모른다 :

<h:form> 
<h:outputText value="#{profile.username}"/><br/> 
<h:outputText value="#{profile.password}"/><br/> 
</h:form> 

당신이 코드의 다른 부분이 필요하면 알려 주시기 바랍니다. 가 지금은이 같은 @PostConstruct 주석을 사용하여 내 profile.xhtml 페이지에 일부 정크 정보를 표시 할 수 있어요, 당신이


확인 감사합니다 그러나

@PostConstruct 
private void prepareProfile(){ 
    Subject subject = new Subject(); 
    username = String.valueOf(subject.getPrincipals().size()); 
    System.out.println(username); 
} 

을, 나는 정보를 잡아하는 방법을 무시 그냥 인증 된 사용자로부터. 의견이 있으십니까? 고맙습니다.

답변

1

이것은 너무 늦을 수 있습니다. 그러나이 페이지를 검색 할 때 다른 사람에게 도움이 될 수 있습니다.

우리는 인증 된 사용자를 세션에 저장하여이를 해결했습니다. 다음을 사용하여 CustomLoginModule에서 세션을 검색 할 수 있습니다. ((HttpRequest)PolicyContext.getContext("javax.servlet.http.HttpServletRequest")).getSession()

그런 다음 필요할 때마다 세션에서 세션을 검색 할 수 있습니다.

JSF를 사용하여 세션 빈에 저장할 수 있습니다. 여기로 들어가지 않을 이유 때문에 CustomLoginModule에서 자동으로 주입이 수행되지 않습니다. 예를 들어 initialize 메소드에서 주입을 요청해야합니다.


여기 클래스의 주입을 요청하는 예 방법 :이 같은

public static <T> void programmaticInjection(Class clazz, T injectionObject) throws NamingException { 
    log.trace("trying programmatic injection for "+clazz.getSimpleName()); 
    InitialContext initialContext = new InitialContext(); 
    Object lookup = initialContext.lookup("java:comp/BeanManager"); 
    BeanManager beanManager = (BeanManager) lookup; 
    AnnotatedType annotatedType = beanManager.createAnnotatedType(clazz); 
    InjectionTarget injectionTarget = beanManager.createInjectionTarget(annotatedType); 
    CreationalContext creationalContext = beanManager.createCreationalContext(null); 
    injectionTarget.inject(injectionObject, creationalContext); 
    creationalContext.release(); 
} 

전화를 : programmaticInjection(CustomLoginModule.class, this);

그런 다음 세션 빈을 주입, 사용자 정보를 삽입하고 프로필에서 사용 백킹 빈.