2012-03-22 81 views
6

utilizo jsf2.0 y EE6 java en un JBoss AS 7sesión - eliminar sesión después de inicio de sesión y hacer una nueva sesión - pero el usuario no está conectado a continuación en más

tengo un LoginController.java con este aspecto :

@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 */ 

} 

La OWASP dice, por razones de seguridad que después de un inicio de sesión las sesiones deben ser borrados (ver: V3.7)

hago esto en mi código en este punto:

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

Primero, borro la sesión anterior, luego hago una nueva sesión.
Después de esto, puedo configurar el inicio de sesión cierto ...

Por supuesto, después de correr a través de todo el código, el usuario no está conectado, ya que el LoginController se gestiona en el ámbito de sesión de edad - y en la nueva sesión alcance hay un nuevo LoginController en el alcance sin el usuario ingresado ...

¿Hay alguna manera de agregar un nuevo LoginController a la nueva sesión después de la creación?

¿Cuál es la forma más común de hacerlo?

Respuesta

4

Al invalidar la sesión, todos sus atributos se descartarán al final de la respuesta. Sin embargo, está configurando el estado de inicio de sesión en una instancia de bean con ámbito de sesión que solo vive en la sesión anterior.

Básicamente es necesario recrear manualmente el bean con ámbito de sesión y ponerlo en la nueva sesión después de invalidar.

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

(mirada ma, no hay feas javax.servlet importaciones más!)

Por cierto, cuando se va de esta manera, se podría también acaba de hacer su LoginController una vista con ámbito de frijol y tratar con User en la sesión solamente

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

(Estará disponible por #{user} en todo el contexto EL, también en propiedades controlada, que no necesariamente tiene que ser un bean gestionado JSF)

+0

y otra vez ... le da las gracias! esto funciona perfecto ... si necesito el userProvider para el cierre de sesión nuevamente ... pero si intento cerrar la sesión, hago algo como: 'loggedIn = false; \t \t user.setLoggedIn (false); userProvider.saveChangedUser (usuario); ExternalContext externalContext = FacesContext.getCurrentInstance(). GetExternalContext(); externalContext.invalidateSession(); 'pero el usuario del proveedor está vacío. También trato de poner userProvider en la sesión también, pero no funciona, y después de ese error, no puedo volver a iniciar sesión porque el userProvider es nulo ... – Joerg

+0

... bien, veo que userProvider no está vacío, pero el entityManager dentro del userProvider (y todo lo demás que está '@ Injected' o' @ Produces' está vacío) – Joerg

+2

'@ Inject' es de CDI y no funciona en JSF' @ ManagedBean', solo en CDI '@ Named' . Convierta el 'UserProvider' en' @ Stateless' e inyéctelo mediante '@ EJB'. – BalusC

Cuestiones relacionadas