2012-03-22 1 views
6

로그인하지 않은 - 로그인 후 세션을 삭제하고 새 세션을 :세션 고정은 - 나는 LoginController.java이처럼 보이는이 있지만 사용자는 내가 7</p> <p>으로 JBoss에서의 jsf2.0 및 자바 EE6을 사용하여 더 이상

내가이 시점에서 내 코드에서이 작업을 수행 :

:

@ManagedBean(name = "loginController") 
@SessionScoped 
public class LoginController implements Serializable{ 

    private static final long serialVersionUID = 1119172305268193508L; 

    @Inject 
    private UserProvider userProvider; 

    @PostConstruct 
    public void initNewUser() { 
     user = new User(); 
    } 

    private User user; 

    private String accountName; 

    private String password; 

    public String ownLogin() throws Exception { 

     HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance() 
       .getExternalContext().getRequest(); 


     if (accountName != null) { 
      try { 


       if (exists(accountName)) { 

        user = userProvider.findUserByAccountName(accountName); 

        if (verifyPassword(user, password)) { 

         userProvider.saveChangedUser(user); 


         // OWASP SAYS: after login, destroy the session make a new one 
         // a so called handover 
         // Destroy the session 
         FacesContext facesContext = FacesContext.getCurrentInstance(); 

         HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false); 
         if(session != null){ 
          session.invalidate(); 
         } 
         // create new session after logout 
         session = (HttpSession) facesContext.getExternalContext().getSession(true); 
        setLogin(true); 
      }     
    } 

/* some getters and setters */ 

} 

OWASP는 세션을 삭제해야 로그인 후 (V3.7 참조)하는 것이 보안을 위해 말한다

FacesContext facesContext = FacesContext.getCurrentInstance(); 

          HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false); 
          if(session != null){ 
           session.invalidate(); 
          } 
          // create new session after logout 
          session = (HttpSession) facesContext.getExternalContext().getSession(true); 

먼저 기존 세션을 삭제 한 다음 새 세션을 만듭니다.
그런 다음 로그인을 true로 설정했습니다 ...

물론 전체 코드를 실행 한 후 LoginController가 이전 세션 범위 및 새 세션에서 관리 되었기 때문에 사용자가 로그인하지 않았습니다. 범위 거기에 로그인 한 사용자없이 범위에 새로운 LoginController가 있습니다 ...

생성 후 새 세션에 새 LoginController를 추가하는 방법은 있습니까?

또는 일반적인 방법은 무엇입니까?

답변

4

세션을 무효화하면 모든 속성이 응답의 끝으로 휴지통으로 폐기됩니다. 그러나 이전 세션에만있는 세션 범위의 bean 인스턴스에 로그인 상태를 설정하고있다.

기본적으로 수동으로 세션 범위 Bean을 다시 작성하고 무효화 후 새 세션 에 넣어야합니다.

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
externalContext.invalidateSession(); 
LoginController loginController = new LoginController(); 
loginController.setUser(user); 
externalContext.getSessionMap().put("loginController", loginController); 

(더 이상 봐 엄마, 아니 추악한 javax.servlet 수입!) 그런데

,이 길을 갈 때, 당신은 또한 당신의 LoginController 뷰가 빈을 범위 확인하고 User에서 처리 할 수 세션 만.

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
externalContext.invalidateSession(); 
externalContext.getSessionMap().put("user", user); 

(이 관리 속성에 또한 EL 컨텍스트를 통해 #{user}로 사용할 수 있습니다, 그것은 반드시 JSF는 빈 관리 할 필요가 없습니다)

+0

다시 ... 당신에게 감사! 이 완벽하게 작동합니다 .... 다시 logout userProvider 필요한 경우 ...하지만 로그 아웃하려고하면, 뭔가를 만들 :'loggedIn = false; \t \t user.setLoggedIn (false); userProvider.saveChangedUser (user); ExternalContext externalContext = FacesContext.getCurrentInstance(). getExternalContext(); externalContext.invalidateSession();'하지만 userprovider는 비어 있습니다. 나는 또한 userProvider를 세션에 넣으려고 시도했지만 작동하지 않습니다. - 그리고 그 오류가 발생하면 userProvider가 null이기 때문에 다시 로그인 할 수 없습니다 ... – Joerg

+0

... ok, userProvider가 비어 있지 않습니다. userProvider 안에있는 entityManager (그리고'@Injected' 또는'@Produces'는 비어 있습니다.) – Joerg

+2

'@ Inject'는 CDI이고 JSF'@ ManagedBean'에서는 작동하지 않습니다. 단지'@ Named' . 'UserProvider'를 @Stateeless로 만들고 그것을 @ EJB'로 주입하십시오. – BalusC

관련 문제