2

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

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


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

4

3 回答 3

1

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

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

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

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

干杯,

于 2011-09-09T13:32:01.693 回答
1

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

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

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

于 2011-09-09T13:29:52.317 回答
0

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

于 2011-09-09T13:03:37.490 回答