2012-03-22 10 views
6

Io uso jsf2.0 e Java EE6 su un JBoss AS 7sessione di fissazione - eliminare la sessione dopo il login e fare una nuova sessione - ma l'utente non è poi loggato più

ho un LoginController.java simile a questo :

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

} 

L'OWASP dice, per motivi di sicurezza che, dopo un inizio le sessioni dovrebbero essere cancellati (vedi: V3.7)

faccio questo nel mio codice, a questo 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); 

Prima di tutto, elimino la sessione precedente, quindi eseguo una nuova sessione.
Dopo questo, ho impostato il login vera ...

Naturalmente, dopo che attraversa tutto il codice, l'utente non è connesso, in quanto il LoginController è stato gestito nel vecchio campo di applicazione della sessione - e nella nuova sessione scope c'è un nuovo LoginController nello scope senza l'utente connesso ...

C'è un modo, per aggiungere un nuovo LoginController alla nuova sessione dopo la creazione?

O qual è il modo comune per farlo?

risposta

4

Quando si annulla la sessione, tutti i relativi attributi verranno eliminati per fine risposta. Stai tuttavia impostando lo stato di accesso su un'istanza di bean con ambito sessione che risiede solo nella vecchia sessione.

Fondamentalmente è necessario ricreare manualmente il bean con scope di sessione e inserirlo nella nuova sessione dopo l' invalido.

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

(ma aspetto, non è un brutto javax.servlet importazioni più!)

A proposito, quando si va in questo modo, si potrebbe anche solo fare il vostro LoginController vista ambito di fagioli e trattare con User in solo la sessione.

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

(che sarà disponibile dal #{user} tutto il contesto EL, anche in immobili gestiti, ma non deve necessariamente essere un JSF bean gestito)

+0

e ancora ... vi ringrazia! questo funziona perfettamente .... se ho bisogno di userProvider per il logout di nuovo ... ma se provo a uscire, faccio qualcosa del tipo: 'loggedIn = false; \t \t user.setLoggedIn (false); userProvider.saveChangedUser (utente); ExternalContext externalContext = FacesContext.getCurrentInstance(). GetExternalContext(); externalContext.invalidateSession(); 'ma il userprovider è vuoto. ho anche provato a mettere il userProvider anche alla sessione, ma non funzionava - e dopo quell'errore, non riesco ad accedere di nuovo - perché userProvider è nullo ... – Joerg

+0

... ok, vedo che userProvider non è vuoto - ma l'entityManager all'interno di userProvider (e tutto il resto che è '@ Injected' o' @ Produces' è vuoto) – Joerg

+2

'@ Inject' è di CDI e non funziona in JSF' @ ManagedBean', solo in CDI '@ Named' . Imposta 'UserProvider' a' @ Stateless' e inseriscilo con '@ EJB'. – BalusC

Problemi correlati