我希望改成create-session="stateless"
将是我在webapp中实现无状态Spring安全性的结束,但事实并非如此。
随着这种变化,Spring安全性似乎无法正常工作,因为(我的假设)spring security不会在会话中存储任何内容,也无法对安全的Web请求进行身份验证。
如何使用此无状态功能?
我似乎无法找到关于如何为无状态webapp实现无状态弹簧安全性的任何相关示例。
谢谢!
答案 0 :(得分:25)
Donal的答案基本上是正确的,对于浏览器,您可能不希望使用无状态应用程序。
作为参考,create-session="stateless"
是一个更好的选择,如果你真的有一个无状态的应用程序,如RESTful客户端。此选项是在Spring Security 3.1中引入的。它将避免添加使用会话的Spring Security基础架构的部分内容(例如HttpSessionSecurityContextRepository
,SessionManagementFilter
,RequestCacheFilter
),因此您可以获得更精简的设置。
使用create-session="never"
,Spring Security将永远不会创建会话,但如果您的应用程序可以使用,则会使用一个会话。在实践中,许多用户甚至不知道他们正在创建会话,所以如果你真的不想要会话,那么stateless
是最好的选择。
答案 1 :(得分:21)
我有一个基于Spring的webapp,它具有完全无状态的安全性,让它像这样工作的唯一方法是完全禁用会话创建(使用create-session="never"
)。这会强制对每个请求进行重新身份验证,因此您也希望将webapp配置为使用HTTP Basic Auth或Digest Auth(当然是通过HTTPS),因为这些不需要特别复杂的协商(相比之下,形式基于登录和OAuth,需要会话,因为它们有一个更复杂的过程来建立身份验证上下文)。这意味着您需要在<security:http-basic />
元素中添加<security:http>
之类的元素。
(这样做的好处是它可以实现极其简单的客户端库,因为它们不必进行cookie /会话管理。成本是一些处理开销 - 建立用户参与的角色集合因为必须在每个请求上重新计算 - 以及您可以使用哪些认证机制的一些限制。)