Spring 安全每次返回相同的令牌

Spring Security returning the same token each time

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

  1. 客户端发送带有 oauth2 参数的令牌请求 (/oauth/token)。

  2. spring 安全应用程序为用户创建令牌并使用 access_token、refresh_token、自定义用户对象(名称、组织、电子邮件等)和权限(角色)。

  3. 客户添加了额外的角色(例如 ROLE_CLIENT、ROLE_USER)。

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

  5. 下次客户端发送令牌请求时,spring安全returns先前创建的令牌(尚未过期)以及用户和权限信息。此权限信息不是最新的角色(在步骤 4 中添加)。

此处 spring 安全始终使用现有令牌(因为它未过期)并返回有效令牌。这是预期的行为,即使正在修改用户对象吗?

如果您希望下一个请求获得具有新角色的新访问令牌而不是 return 具有现有角色的现有令牌,那么听起来您需要在用户角色更改时撤销访问令牌,如果仍然有效。

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

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

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

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