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?
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
... ok, vedo che userProvider non è vuoto - ma l'entityManager all'interno di userProvider (e tutto il resto che è '@ Injected' o' @ Produces' è vuoto) – Joerg
'@ Inject' è di CDI e non funziona in JSF' @ ManagedBean', solo in CDI '@ Named' . Imposta 'UserProvider' a' @ Stateless' e inseriscilo con '@ EJB'. – BalusC