spring boot oauth2.0 和 spring security:如何向通过 facebook 或 slack 登录的用户授予权限(权限)

Ana*_*nda 5 spring oauth spring-security oauth-2.0

我有一个使用 spring boot oauth2.0 构建的身份验证服务器,并遵循 david_syer 模型。

我的身份验证服务器执行以下操作 -

  1. 让用户通过第三方 oauth 提供商(如 google)登录,或让用户使用用户名和密码在我们的服务器上创建帐户并生成令牌。

  2. 因此,当用户使用像 google 这样的外部 oauth 登录时,我只需存储令牌并将相同的(google)令牌传递到我的 UI 应用程序以访问资源 api 服务器。我有一个验证令牌并允许 api 访问的身份验证过滤器。

  3. 当用户使用用户名和密码获取令牌时,我们存储用户及其权限并为他生成令牌。现在,UI 使用我们的身份验证服务器生成的令牌来访问资源 api 服务器。

现在我的问题是

  1. 这是使用来自外部 api 的令牌并使用相同的令牌访问我们的资源 api 服务器的正确方法吗?
  2. 由于我没有为他们添加用户条目和权限,如何为使用第 3 方 oauth 提供商注册的用户添加权限?

因此,如果用户来自永恒的提供者,加载用户和用户权限(来自 UserDetailsS​​ervice 的 loadUserByUsername() )的 spring security 将不会有任何东西。

小智 4

我对第 2 步有一个建议:在用户使用 google 身份验证并重定向回您的应用程序页面后,在您的服务器上进行声明转换,并生成由您拥有的身份服务器颁发的您自己的令牌。

原因是您将能够提供特定的声明,并且声明名称不一定需要匹配。

这样您就可以始终在客户端应用程序上验证自己的令牌。因此,假设用户使用 Facebook 而不是 Google,即使在这种情况下,因为您将分配自己的令牌,您也不需要验证来自不同第三方身份服务器的令牌。

这样,您的身份服务器信任 Facebook、Google 提供的令牌,并且您的应用程序将仅信任您的身份服务器,因此您的应用程序不需要知道哪个 IDP 正在颁发令牌。

通过我上面建议的方法,您甚至可以自行修改用户的声明,而不必依赖第三方身份服务器来提供声明。