【问题标题】:How can I avoid using server-side sessions for authentication in a Java webapp?如何避免在 Java webapp 中使用服务器端会话进行身份验证?
【发布时间】:2011-11-13 18:51:27
【问题描述】:

我想保护对 Web 应用程序中资源的访问,因此我使用标准机制对我的用户进行身份验证,并使用服务器端会话来保留经过身份验证的状态。

我想在负载平衡配置中跨多个系统进行部署,但我不想开始跨我的基础架构同步会话状态。有没有办法(使用 Java EE 中的规范驱动工具或 Spring Security 等常用库)在没有服务器端会话的情况下保留用户的身份验证状态,例如通过将所需状态推回客户端?如果是这样,我需要注意其他风险吗?


更新 - 我根据 Java EE webapp 规范使用声明式安全性并通过 LDAP 存储库进行身份验证。

【问题讨论】:

    标签: session authentication jakarta-ee web-applications stateless


    【解决方案1】:

    我不知道框架解决方案,但以下方法确实有效:

    用户成功登录后,您创建一个安全令牌并将其值设置为 cookie。令牌包含所需的所有信息(用户 ID、创建时间等),并使用某种算法进行加密。因此,集群中的所有节点都可以读取令牌、解密并识别用户。然后您创建一个ServletFilter 拦截所有请求,检查令牌并设置相应的用户凭据,例如ServletRequest.getRemoteUser() 使用 HttpServletRequestWrapper

    解决问题的一种方法。但你必须小心,自制的安全必须经过深思熟虑。

    【讨论】:

      【解决方案2】:

      您可以在身份验证后将某种令牌存储在 cookie 中,并自行管理会话属性。例如,有一个数据库表,其主键是身份验证令牌并存储用户会话数据...不要忘记实现一个作业来清理非活动的“会话”。

      至于您应该注意什么,请记住,cookie 是易于访问、窃取、删除、禁用等的东西。身份验证令牌应该是强大且可验证的(用户 ip + 浏览器的哈希组合+ 旋转盐 + 其他一些你可以检查的东西)。

      将用户身份验证分为两个级别也是明智的。 “有 cookie”和“刚刚验证了 cookie”... 假设“有 cookie”是一种状态,可以存在半小时(或者更长时间),允许用户浏览网站。 “刚刚验证”状态用于重要操作,应要求用户再次输入其凭据。这种“刚刚验证过的状态”的超时时间不应超过几分钟。

      请记住,我假设您的网站没有保存真正敏感的数据。对于这些情况,我建议使用诸如使用外部令牌或安全卡的双向 SSL 身份验证加上旋转令牌设备加上生物识别身份验证 :D:D:D... 我想你明白我的意思了。

      干杯,

      【讨论】:

        【解决方案3】:

        您可以使用开放式 id 服务器进行身份验证,从而分离您的身份验证和应用程序逻辑。

        【讨论】:

        • 我想我还是有同样的问题。 (我目前正在使用 LDAP 身份验证)当用户尝试访问受保护的资源时,他们会被发送到登录表单。他们登录,然后(如果成功)被发送到资源。但我认为会话 ID 用于“记住”用户已登录,需要将会话数据存储在服务器上。如何避免在服务器上存储会话数据但仍记住用户的身份验证状态?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-08
        • 2021-12-05
        • 2017-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-08
        相关资源
        最近更新 更多