Spring Security 每次返回相同的令牌

Posted

技术标签:

【中文标题】Spring Security 每次返回相同的令牌【英文标题】:Spring Security returning the same token each time 【发布时间】:2019-11-08 08:23:54 【问题描述】:

我们在项目中使用了 spring security(授权和资源服务器)。

    客户端使用 oauth2 参数发送令牌请求 (/oauth/token)。

    spring security 应用为用户创建一个令牌,并使用 access_token、refresh_token、自定义用户对象(名称、组织、电子邮件等)和权限(角色)响应客户端。

    客户端添加其他角色(例如 ROLE_CLIENT、ROLE_USER)。

    spring 应用程序将为给定用户存储上述角色。

    下次客户端发送token请求时,spring security会返回之前创建的token(尚未过期)以及用户和权限信息。此权限信息不是最新的角色(在第 4 步中添加)。

这里 spring security 总是使用现有的令牌(因为它没有过期)并返回有效的令牌。即使用户对象正在被修改,这是预期的行为吗?

【问题讨论】:

【参考方案1】:

如果您希望下一个请求获取具有新角色的新访问令牌并且不返回具有现有角色的现有令牌(如果它仍然有效),那么听起来您需要在用户角色更改时撤销访问令牌。

在您更新用户角色时,您可能希望撤销令牌。 我没有亲自测试过,但我在这里找到了它的指南https://www.baeldung.com/spring-security-oauth-revoke-tokens,所以你的里程可能会有所不同。

我想补充一点,这听起来不像正常的 OAuth2 流程,您可能会在这里打破一些约定,这些约定可能会在以后给您带来麻烦。也就是说,如果您对建议的解决方案有信心,则不必遵循标准。

编辑:澄清用户角色和访问权限通常是资源的一部分,而不是令牌交换的一部分。例如,您有一个普通的 OAuth2 请求,该请求生成一个令牌,您可以交换访问令牌,正如您在步骤 1 和步骤 2 中所述。然后您通常会获取该访问令牌并从资源请求用户访问信息例如“userinfo”服务或类似的东西。

您的安全服务也可以是资源服务器,但这两个步骤应该被视为不同。然后,当您想要修改用户角色时,您可以通过资源再次执行此操作。这意味着下次您调用该资源时,它将拥有最新信息,而无需再次验证用户身份。

【讨论】:

以上是关于Spring Security 每次返回相同的令牌的主要内容,如果未能解决你的问题,请参考以下文章

登录 Spring Security 后如何返回基本令牌?

spring security permitAll 仍在考虑在 Authorization 标头中传递的令牌,如果令牌无效则返回 401

Spring Security 3.2 令牌认证

Spring Security oAuth 2.0 UAA 自动获取令牌值

Grails 2.5.4 / Spring Security Rest 1.5.4 - 验证令牌

使用 Spring Security 3 在我的 Grails OAuth 提供程序上存储访问令牌