0

通常我在我的项目中使用带有自定义登录表单和 bean 的 Java EE 身份验证。因此,我将 Glassfish 配置为从数据库 (JDBC) 获取用户/密码,创建一个调用 HttpServletRequest 的 login() 方法的 RequestScoped bean(名为“LoginBean”)上的 login() 方法的 jsf 表单。

当登录尝试成功时,我将用户信息设置在一个注入到 LoginBean 中的 SessionScoped bean 中,我将其命名为“LoginService”。然后,在许多其他网站页面和 bean 中,我总是通过注入 LoginService 并访问它的数据来使用这些数据。

一切都很好,但我注意到如果用户进入登录页面,即使它尚未尝试登录,也会创建一个会话。我的猜测是它的发生是因为 LoginService 在对象创建时总是被注入到 LoginBean 中。

正因为如此,我有两个问题:

  1. 我应该关心这个会话吗?这会导致任何问题吗?
  2. 在每次用户访问登录页面时不创建会话的情况下进行此自定义登录的最佳方法是什么?我的意思是,我可以在成功后在查询字符串上传递用户信息,但这太可怕了。:)

谢谢。

4

2 回答 2

2

我应该关心这个会话吗?这会导致任何问题吗?

依靠。如果您的服务器在相对“便宜”的硬件上,那么成功进行 DDOS 攻击的机会就更大,因为在达到硬件限制之前,可以创建的会话多于服务器可以破坏的会话。


在每次用户访问登录页面时不创建会话的情况下进行此自定义登录的最佳方法是什么?

不要注入会话范围的 bean。自己放置User会话中的地图。有关具体示例,另请参见使用 j_security_check 在 Java EE / JSF 中执行用户身份验证的“更新”部分:

public void login() throws IOException {
    FacesContext context = FacesContext.getCurrentInstance();
    ExternalContext externalContext = context.getExternalContext();
    HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();

    try {
        request.login(username, password);
        User user = userService.find(username, password);
        externalContext.getSessionMap().put("user", user);
        externalContext.redirect(originalURL);
    } catch (ServletException e) {
        // Handle unknown username/password in request.login().
        context.addMessage(null, new FacesMessage("Unknown login"));
    }
}
于 2013-02-14T17:05:14.377 回答
2

既然你用 CDI 标记了这个,我有点怀疑这样做:

externalContext.getSessionMap().put("user", user);

我对 glassfish 不熟悉,也不知道“Java EE 身份验证”是关于什么的。所以这只是我作为 CDI+tomcat 用户的两分钱。

我想说,如果你想用 CDI 来做这件事,你不应该让 bean 成为 @SessionScoped 看看你需要如何更好地控制它。

The userBean: I would go for @WindowScoped from myfaces CODI (will be included in deltaspike 0.4). I would have the loginBean be @RequestScoped. I would have a second loginBean @ViewScoped (myfaces codi required).

@PreDestroy could then be used on a method on our main loginBean. If authenticated == false we should destroy the @windowScoped bean.

The @ViewScoped bean is responsible for remembering number of failed login attempts and the username. Then again this is only if I would actually mind just creating the @WindowScoped bean (I don't for my projects)

于 2013-02-14T21:14:17.993 回答