使用 spring security 和 mongodb 进行 Rest 身份验证

Posted

技术标签:

【中文标题】使用 spring security 和 mongodb 进行 Rest 身份验证【英文标题】:Rest authentication with spring security and mongodb 【发布时间】:2019-05-29 11:15:30 【问题描述】:

我已经用mongodb 实现了一个Spring 应用程序,现在我已经实现了Rest authentication with Spring security and Mongodb,现在我必须添加Authorization 标头,它只显示来自api 调用的数据,如果Authorization 可以,从现在开始就可以了,但是我想知道如何获得这个值?我的意思是我想登录应用程序,我应该获得授权吗?如果不是,登录响应应该返回此授权以在下一次调用中使用它? 我也读过aws tokenoauth2,但是我很想知道这个过程,我的意思是,普通用户可以登录应用程序然后通过授权拨打电话的流程是什么?

我的平台是:

数据库——MongoDB

服务器 -- 弹簧

Web -- Angular

应用 -- 安卓

这是一个问答游戏项目,可以支持多游戏选项(超过 1 名玩家同时玩)

所以我需要了解的是从 APP / WEB 我必须拨打电话让我们说 api/v1/login 然后发送用户和密码,好的,我必须创建 bcrypted 和 salt 东西的部分在哪里将其存储到数据库中?我是否必须在应用程序上执行此操作,然后在登录调用中通过 JSON 发送例如 SHA 内容,或者最好将密码发送到服务器,以便服务器完成所有工作并将这些内容存储在数据库中?

【问题讨论】:

【参考方案1】:

在您描述的场景中,使用 OpenID ConnectOAuth2 是没有意义的。身份验证和资源都有一个服务器。场景大概是这样的:

    客户端(Angular 或应用程序)通过安全的 HTTP 连接以纯文本形式将凭据发送到服务器以进行登录 服务器以访问刷新令牌响应 两个令牌都需要保存在客户端设备上(例如本地存储) 您将访问令牌与每个需要身份验证的请求一起发送 在 访问令牌 过期之前,您会触发某个 REST 调用以使用您的 刷新令牌 刷新令牌 服务器发回一个新的访问和一个新的刷新令牌。存储它们并删除旧的。

使用 SpringBoot 您几乎可以免费获得所有功能。除非你没有具体的例子,否则我会不遗余力地提供代码 sn-ps。您可以在 auth0 site 上找到精彩而简洁的示例。

查找 here Angular 教程,了解如何随请求一起发送访问令牌

关于您的数据库问题,一个简单但有效的方案可能是将 加密 密码与您的用户一起存储(在数据库中)。如果用户登录,他会将您需要加密的纯文本密码发送给您,并将其与您存储的密码进行比较。切勿存储纯文本密码,仅将其用于登录过程。有几个best practices 您可能需要考虑在 Java 应用程序中使用密码。

【讨论】:

是的,这就是我所需要的,但 Matt 你能具体说明我应该在 DB 上做什么吗?那么,我应该保存 Bcrypted 密码吗?最好检查一下 user == user and password == password 而不是 user == user and passwordencrypted == passwordencrypted? 我在帖子中添加了一个关于登录过程的部分。 谢谢马特,很好的答案,我想我的最后一个问题是,应用程序/网络如何知道令牌已过期?例如,当我进行 api 调用时,它会返回 403,然后我必须进行额外的调用? 说到令牌,您通常(但不一定)是指 JWT,它是一种 JSON 结构,可以包含多个属性,其中包括令牌的发布时间和到期时间。有了这些信息,您就知道何时刷新令牌。无需让后端检查令牌的有效性。见en.wikipedia.org/wiki/JSON_Web_Token【参考方案2】:

我强烈建议您使用 Spring Security、OAuth2 和 JWT 令牌来保护您的 REST API。 流程如下:

用户可以登录应用程序 生成令牌 此令牌设置在每个请求的标头中

通常令牌有一个持续时间 基本上 OAuth2 定义了 2 个实体:

授权服务器:它是负责授权过程的实体。它检查提供的凭据,如果一切正常,它会生成令牌 资源服务器:它将公开 REST API 的实体。这 实体将检查每个请求中是否存在令牌以及 令牌有效

萌信息在这里https://www.baeldung.com/spring-security-oauth-jwt

更新

在这里https://github.com/angeloimm/spring_oauth我上传了一个简单的示例 og Spring(而不是 Spring Boot)基于 DB H2 的 OAuth JWT 身份验证。

您可以下载它并使其适应 mongodb。我认为适应它已经足够简单了。可悲的是,这对我来说是一个非常紧张的工作时期,我无法做到。

希望有用

安杰洛

【讨论】:

Oauth 是一种授权委托协议,而不是身份验证协议。 Oauth2 与 JWT 身份验证层一起称为 Open Id Connect (OIDC) 那么,我必须将它们存储在应用程序的缓存和网络的缓存中吗?我的意思是 access_token 和 refresh_token?如何从双方获取它们? 谁可以生成access_token和refresh_token是授权服务器。一旦你得到它们,你必须把它们储存起来。如何存储它们取决于您的业务逻辑。例如。如果 access_token 永不过期,那么您应该以某种方式将其持久化。否则,您可以拥有一个持续时间等于令牌持续时间的缓存 您能举个例子吗?你从春天得到那些?所以我必须将它们作为登录的答案发送?我不需要有关 Web 或 android 的示例,我需要有关如何通过服务器提供它们以及在那里存储什么的示例 对不起,我一直很忙。明天我将提供一个完整的工作示例

以上是关于使用 spring security 和 mongodb 进行 Rest 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Security 模拟身份验证和授权

如何使用 Spring-Security 3 和 Hibernate 4 将 spring security xml 配置 hibernate 转换为 java config

使用 Spring 和 Spring Security 正确注入 SessionFactory

Spring Framework,Spring Security - 可以在没有 Spring Framework 的情况下使用 Spring Security?

如何使用spring-security通过用户名和密码登录?

Spring 框架 4.0 和 Spring security 3.2.4 上的 Spring Security SAML 扩展