Jakarta ee Java EE web应用程序“;“记住我”;自动登录正确吗?

Jakarta ee Java EE web应用程序“;“记住我”;自动登录正确吗?,jakarta-ee,authentication,web-applications,cookies,remember-me,Jakarta Ee,Authentication,Web Applications,Cookies,Remember Me,情况: 基于用户名/密码进行用户身份验证的javaeeweb应用程序 密码验证不是由应用程序本身完成的。它使用,安全域在应用服务器中定义 应用程序使用授权(@RolesAllowed annotation) 应用程序允许记住用户,因此他不需要每次都进行身份验证 我认为这是web应用程序的常见需求,但最后一个需求并不是那么容易实现,我还没有找到实现这一需求的标准方法。我喜欢展示我的想法,并解释为什么我认为它们并不完美 1只需保持HttpSession打开即可 事实上,这是我最喜欢的方式。我想用

情况:

  • 基于用户名/密码进行用户身份验证的javaeeweb应用程序
  • 密码验证不是由应用程序本身完成的。它使用,安全域在应用服务器中定义
  • 应用程序使用授权(@RolesAllowed annotation)
  • 应用程序允许记住用户,因此他不需要每次都进行身份验证
我认为这是web应用程序的常见需求,但最后一个需求并不是那么容易实现,我还没有找到实现这一需求的标准方法。我喜欢展示我的想法,并解释为什么我认为它们并不完美

1只需保持HttpSession打开即可
事实上,这是我最喜欢的方式。我想用这个就行了。基本上是这样的,但是如果会话没有被正确地清理,并且你有很多用户,这可能是资源问题。我自己的问题表明清理HttpSession并不总是那么容易

2使用“记住我”饼干
为什么不生成一个UUID并将其作为cookie发送,然后在HttpSession是新的时候检查它呢。如果安全域的唯一用途是检查用户名/密码,那么这种方法非常有效。如果使用了授权或类似的功能,则不可能。我还没有找到使用令牌而不是密码的方法或类似函数

3使用“记住我”cookie并使用我自己的授权
当然,这是可能的,但是我喜欢用一种简单的方法来限制对一些bean或方法的访问。这使得我很难实现一些用户可以访问他不应该访问的东西

4使用带有密码的“记住我”cookie
愚蠢的下一个

5使用“记住我”cookie并保留密码
其思想是记住密码以及与cookie的关系,因此HttpServletRequest.login()可以与密码一起使用。 这就是答案中解释的方法:
我认为这种方法有一个大问题:永远不要存储未加密的密码
你可以考虑把密码保存在内存中,但我也不喜欢这样。该应用程序可以在任何地方使用,如果某个公司的所有密码都被泄露,我不想为此负责,因为有人临时访问了服务器并进行了内存转储。

我当前的解决方案
基于这些想法,我提出了自己的解决方案。我用了两块饼干。第一个是一个“记住我”的cookie,用字符串表示。此UUID还与用户名一起存储在内存或数据库中。第二个cookie还包含UUID的字符串表示形式,用于加密密码。加密密码与数据库或内存中第一个cookie的UUID一起被记住。第二个cookie中的UUID未保留。既不在数据库中,也不在内存中。加密和解密我正在使用的用户密码
当用户尝试使用此cookie重新验证时,我会同时读取它们,根据第一个cookie搜索用户名和加密密码,使用第二个cookie解密密码,并使用HttpServletRequest.login()和用户名和密码。然后删除存储在服务器上的加密密码,并使用两个新UUID重新启动进程

问题

  • 真的没有标准化的解决方案吗

  • 我的解决方案中是否存在我看不到的安全问题
    e、 g.在重新认证时使用新密钥加密密码是否不明智

  • 对于此任务,StandardPBEStringEncryptor是一个不错的选择吗

  • 我的解决方案是否过火了,我在浪费时间

  • 谢谢

  • ServletAPI中确实没有“记住我”的标准
  • 我相信您的解决方案更容易被cookie窃取,因为您的第二个UUID用于加密密码并存储在cookie中。显示登录cookie中通常保存的内容
  • 双向加密真的有必要吗?单向加密更简单,更易于处理。根据您的应用程序安全要求,SHA-512以上的任何内容都是合适的哈希算法
  • 我建议你看看ApacheShiro。它支持MemberMe、salted密码散列和多种算法(仅单向,但我不确定)以及类似于安全拦截器的
    @RolesAllowed

  • 如果你选择Shiro,那真的是彻底和完整的。您还可以查看shiro.apache.org上的官方文档

    您找到了更好的解决方案吗?没有,我仍然像这样使用它。