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?
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
... 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
'@ 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