本地认证,我如何记住并获得登录用户



我在应用程序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";
    }
}

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

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是否不等于null

User user = (User) session.getAttribute("user");
if (user != null) {
    // User is logged in.
} else {
    // User is not logged in.
}

这立即解决了获取"当前"用户的问题。#{user}已经提供了这种方式。

<p>Your email is #{user.email}.</p>

与具体问题无关,您最好不要在JSF工件中从JSF的掩护下抓取原始HttpSessiongetSession(false)中的false论点也是另一个思维错误,容易在后面出现NullPointerException。请使用ExternalContext#getSessionMap()

context.getExternalContext().getSessionMap().put("user", user);

相关内容

  • 没有找到相关文章