jsf - Homegrown authentication, how do I remember and get the logged in user -
i made filter , authentication in application jsf works i'd current user , have no idea how that. me?
this method authenticates
public string authenticates() { facescontext fc = facescontext.getcurrentinstance(); entitymanager manager = getmanager(); persondao dao = new persondaojpa(manager); if (dao.login(getperson().getemail(), getperson().getpassword())) { externalcontext ec = fc.getexternalcontext(); httpsession session = (httpsession) ec.getsession(false); session.setattribute("userlogged", true); getcurrentuser(); return "/index.xhtml" + "?faces-redirect=true"; } else { facesmessage ms = new facesmessage("email or password incorrect"); ms.setseverity(facesmessage.severity_error); fc.addmessage(null, ms); return "/account.xhtml"; } }
you're setting boolean in session indicate if user logged in or not.
if (userservice.login(email, password)) { session.setattribute("userlogged", true); }
this rather simplistic. can improved putting user in session.
user user = userservice.find(email, password); if (user != null) { session.setattribute("user", user); }
now, wherever you'd check if user logged in, instead of checking if userlogged
equals true
, check if user
not equal null
.
user user = (user) session.getattribute("user"); if (user != null) { // user logged in. } else { // user not logged in. }
this solves problem of getting "current" user. it's way available #{user}
.
<p>your email #{user.email}.</p>
unrelated concrete problem, you'd better not grab raw httpsession
under jsf's covers in jsf artifact. false
argument in getsession(false)
thinking mistake , prone nullpointerexception
later on. instead, use externalcontext#getsessionmap()
.
context.getexternalcontext().getsessionmap().put("user", user);
Comments
Post a Comment