【问题标题】:create-session stateless usage创建会话无状态使用
【发布时间】:2012-02-06 17:19:28
【问题描述】:

我希望更改为 create-session="stateless" 将结束在我的 web 应用中实现无状态 Spring 安全性,但事实并非如此。

随着这一变化,spring security 似乎无法正常工作,因为(我的假设)spring security 不会在会话中存储任何内容,并且无法对受保护的 Web 请求进行身份验证。

如何使用这个无状态功能?

我似乎找不到任何有关如何为无状态 Web 应用实现无状态 Spring 安全性的相关示例。

谢谢!

【问题讨论】:

    标签: spring spring-security


    【解决方案1】:

    Donal 的回答基本上是正确的,对于浏览器,您可能不想使用无状态应用程序。

    作为参考,如果您确实拥有无状态应用程序(例如 RESTful 客户端),create-session="stateless" 是一个更好的选择。此选项是在 Spring Security 3.1 中引入的。它将避免添加使用会话的 Spring Security 基础结构部分(例如HttpSessionSecurityContextRepositorySessionManagementFilterRequestCacheFilter),因此您可以获得更精简的设置。

    使用create-session="never",Spring Security 将永远不会自己创建会话,但如果您的应用创建了会话,则会使用它。在实践中,许多用户甚至不知道他们正在创建会话,所以如果您真的不想要会话,那么stateless 是最好的选择。

    【讨论】:

    • +1:不知道那个选项,但是我还没有深入研究 3.1。
    • +1 让我说这个答案,只是救了我一个受伤的世界。 Tomcat 一直拒绝用户访问,因为我的 RESTful 客户端创建了太多会话。谢谢!
    【解决方案2】:

    我有一个基于 Spring 的 web 应用程序,它具有完全无状态的安全性,使其工作的唯一方法是完全禁用会话创建(使用 create-session="never")。这会强制对每个请求进行重新身份验证,因此您还需要将 webapp 配置为使用 HTTP Basic Auth 或 Digest Auth(当然是通过 HTTPS),因为它们不需要特别复杂的协商(相比之下,表单基于 -based 的登录和 OAuth 都需要一个会话,因为它们建立身份验证上下文的过程要复杂得多)。这意味着您需要在您的 <security:http> 元素中添加一个类似 <security:http-basic /> 的元素。

    (这样做的好处是它启用了非常简单的客户端库,因为它们不必进行 cookie/会话管理。成本是一些处理开销——建立用户参与的角色集因为必须在每个请求上重新计算 - 以及您可以使用的身份验证机制的一些限制。)

    【讨论】:

    • 感谢您的回复。我之前尝试过基本和摘要,但我对无法从我的 web 应用程序“注销”并在不重新启动浏览器的情况下输入新凭据感到非常不舒服。此外,您认为能够轻松地为无状态 webapp/webservices 进行水平扩展是否能够证明性能成本是合理的?
    • @Albert:如果不实际衡量成本,就很难说太多。 :-) 但是,如果您想注销,那么您需要 维护一些客户端状态,这意味着进行 cookie 处理;由于 HTTP 本身是无状态的,因此客户端需要提供某种指示来说明它正在谈论的会话,这是一个硬性要求。
    • 我建议不要太担心一开始就向外扩展;获得用户/客户更是一个问题。横向扩展时,真正的关键是您是否可以复制服务或是否有单例实例;通常,Web 服务器通常相对容易复制,但数据库则不然。
    • 感谢您的建议。谢谢!
    • @DonalFellows 你能帮我stackoverflow.com/questions/48806722/…
    猜你喜欢
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多