Spring Rest api 和 Spring 基本安全
Posted
技术标签:
【中文标题】Spring Rest api 和 Spring 基本安全【英文标题】:Spring Rest api and Spring Basic Security 【发布时间】:2018-03-12 12:23:41 【问题描述】:您好,我是 Spring 和 Spring Security 的新手。目前我正在春季研究rest api。根据 spring 提供 rest api。 rest api 是无状态的,所以我们不能创建会话来休息 api。因为如果我们这样做是无状态的,那么它就违背了其余的设计。所以我的问题是,我们可以永远保持服务器端用户的状态吗? 我们可以在客户端保持它吗?怎么样?? 在spring basic security中我们登录并获取当前用户使用原理。 spring rest 身份验证中的相同情况。所以在 rest api 的情况下,所有需要的是当前登录的用户?。如果 spring rest api 是无状态的,那么 spring security 如何维护当前登录的用户。我读了一些关于 spring 的块,通过它我们使用基于令牌的身份验证,我们可以在其中发送用户名和密码,然后我们获取令牌,并且每次我们请求发送该令牌并知道发送当前请求的用户。令牌存储在 cookie 中。所以cookie存储在客户端。在这种情况下,如果浏览器禁用 cookie,我们如何验证用户和当前登录的用户?
【问题讨论】:
在真正的 RESTful 环境中没有登录,您只需通过Authorization
标头在每个请求中提供用户凭据和密码。在 Spring 安全性中,您可以添加一个 basicAuth()
指令,该指令检查传入请求的此标头的可用性,并且它的值与 Basic $base64enc(username:password)
匹配,它将解码 base64 值并拆分凭据以便从中查找用户用户详细信息服务并将其添加到您可以访问它的安全上下文中
那么在这种情况下,spring security 是否可以全部使用?
取决于您的需求。理论上它可以,虽然我通常倾向于至少提供一个自定义的 UserDetailsService 和一个 AuthenticationProvider,因为我用域特定的属性和设置丰富了实际的 UserDetails 对象。
【参考方案1】:
REST 与安全性无关,它只与数据操作有关,与安全性无关。
因此,通常情况下,您会在 REST 请求中提供某种标识信息。它可以是一组凭据、一个令牌、一个加密令牌等等。例如,令牌的格式之一是 JWT 令牌。但理论上,您也可以使用不同的格式。
Spring 安全支持许多不同的流程。有时您必须到处扩展它并插入一些功能。但总而言之,spring security 的可扩展性非常强,并允许许多不同级别的灵活性,它旨在支持许多不同的流程。
我知道这是一种理论上的答案,但这个问题也很理论:)
【讨论】:
REST 不是关于数据操作,而是关于将客户端与服务器解耦,从而通过依赖常见且广为接受的标准(如 HTTP)来提高架构的健壮性,HTTP 用于根据其处理资源操作操作协议定义。以上是关于Spring Rest api 和 Spring 基本安全的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot Rest api 与 Spring Kafka
使用 Spring Security Rest 插件保护 Grails Rest Api
Spring Boot - 模拟对外部 API 的 POST REST 请求