EJB:如何检查用户是否已通过身份验证

EJB: how to check user is authenticated

使用 JSP 形式记录:

@ManagedBean
@SessionScoped
public class LoginView {

    private String username; //+getter +setter
    private String password; //+getter +setter


    public String submit()
    {
        try {
            HttpServletRequest request = (HttpServletRequest) FacesContext
                    .getCurrentInstance()
                    .getExternalContext()
                    .getRequest();

            request.login(username, password);

        } catch (ServletException e) {
            FacesContext.getCurrentInstance().addMessage("login-form:username",
                    new FacesMessage(FacesMessage.SEVERITY_ERROR, "Validation Error", "Incorrect login or password"));
            return "/login";
        }
        return "/index?faces-redirect=true";
    }
}

如何通过 EJB 检查用户登录?

下面是我需要的例子:

@Stateless
public class SessionServiceBean {

    @Resource
    SessionContext sessionContext;

    @EJB
    UserService userService;

    @Produces
    @Named
    @LoggedIn
    public User getLoggedUser() {
        if (/*  check user is logged */) {
            return userService.getByName(sessionContext.getCallerPrincipal().getName());
        }
    }

}

我只发现未记录的使用名称为 "anonymous",但我认为这不是更好的方法。

  1. 您正在使用@Stateless EJB。在无状态 EJB 中,您使用的是用户会话。这可能不对,bean 应该是@Stateful。
  2. 我认为在您的示例中使用 EJB 毫无意义。使用带有 @SessionScoped 注释的纯 CDI bean 就足够了。

您可以将用户的会话信息直接存储在会话范围的 bean 中。不需要使用 HttpServletRequest。例如:

@Named
@SessionScoped
public class UserSession implements Serializable {

    private User activeUser;

    public void logIn(User user) {
        this.activeUser = user;
    }

    public void logOut() {
        activeUser = null;
    }

    public boolean isLoggedIn() {
        return activeUser != null;
    }

    public User getActiveUser() {
        return activeUser;
    }

}