自行开发的身份验证,我如何记住并获取登录用户

时间:2015-08-19 14:23:45

标签: jsf authentication

我在应用程序JSF中创建了一个过滤器和一个身份验证它运行得很好,但我想得到当前用户,我不知道该怎么做。 有人可以帮帮我吗?

此方法验证

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";
    }
}

1 个答案:

答案 0 :(得分:1)

您基本上在会话中设置布尔值以指示用户是否已登录。

if (userService.login(email, password)) {
    session.setAttribute("userLogged", true);
}

这相当简单。这可以通过简单地将用户自己置于会话中来改进。

User user = userService.find(email, password);

if (user != null) {
    session.setAttribute("user", user);
}

现在,无论您想要检查某个用户是否已登录,而不是检查userLogged是否等于true,您只需检查user是否不等于{ {1}}。

null

这可以立即解决您获得当前"的问题。用户。这种方式已由User user = (User) session.getAttribute("user"); if (user != null) { // User is logged in. } else { // User is not logged in. } 提供。

#{user}
对于具体问题

无关,您最好不要从JSF工件的JSF掩护中获取原始<p>Your email is #{user.email}.</p> HttpSession中的false参数也是另一个思维错误,后来容易出现getSession(false)。相反,请使用NullPointerException

ExternalContext#getSessionMap()