Spring Security 和无状态的 Restful 服务

Posted

技术标签:

【中文标题】Spring Security 和无状态的 Restful 服务【英文标题】:Spring Security & Stateless Restful services 【发布时间】:2017-04-05 03:01:05 【问题描述】:

我的项目分为微服务。我的前端项目是基于 Spring Boot 的 AngularJS。

我的服务完全是 Restful,我想保持这种状态。

因为我的服务是 Restful,所以我在前端使用 HTTP Basic 安全性作为身份验证过程。

在最终用户通过登录页面后,起初一切似乎都很好。

但后来,我意识到由于我的 Restful 风格,我不维护 HTTP 状态,这意味着在即将向服务器发出的请求中,我必须继续向服务器发送 HTTP Basic 凭据。而且我无法验证我想向服务器发出的每个请求的用户身份。

对于这种 HTTP 无状态样式和维护服务器凭据是否有任何解决方法?

在哪里保存凭据最好?

饼干?但这会将状态带回 HTTP 请求。

在我的在线搜索中,我遇到了 Redis 和/或 Spring 会话,这就是答案吗?

【问题讨论】:

【参考方案1】:

Spring Session

Spring Session 是 Spring 产品组合中一个伟大的、鲜为人知的项目。它可以轻松地使您的应用程序使用外部会话存储(例如 Redis)而不是本地化会话(例如 Tomcat)。这允许您利用负载均衡器在多个服务器之间分配流量而不会丢失应用程序状态(例如登录/注销)。它还允许您在不破坏用户会话的情况下重新启动单个服务器。

Restful?

是的,您可以使用修改后的 Spring Session 配置来更恰当地将其与 Rest 端点一起使用。您将使用 HttpBasic 执行初始身份验证,但您将收到一个授权令牌,您将在后续请求中将其作为 Http Header 代替用户名和密码传递。有关详细信息,请参阅文档链接

Spring Security OAuth

这是一个复杂得多的设置,但有一些优势,例如利用外部身份提供者(例如 Google、Facebook)。您还可以促进跨多个应用程序的 SSO。我建议从 Spring Session 开始,因为它对初学者来说要简单得多。

【讨论】:

快速注意这里更新损坏的链接:*这应该是一个更稳定的 Spring Session 参考:spring.io/projects/spring-session *对于“Restful”点,这些更新的链接可能有用:docs.spring.io/spring-session/reference/guides/…@ 987654326@ * 最后,对于 OAuth,链接项目现已弃用,因为 OAuth 功能已完全重新完成并包含在 Spring Security 5 中:github.com/spring-projects/spring-security/wiki/…

以上是关于Spring Security 和无状态的 Restful 服务的主要内容,如果未能解决你的问题,请参考以下文章

Spring 上下文中的有状态 bean 和无状态 bean

Spring 安全性、ssl ldap 和无证书

同一应用程序中的 Spring 和 Jersey State 完整和无状态方法

Spring Security 登录错误:HTTP 状态 404 - /j_spring_security_check

Grails - grails-spring-security-rest - 无法从 application.yml 加载 jwt 机密

Spring-Security:AuthenticationManager 抛出 BadCredentialsException 时返回状态 401