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

Posted

技术标签:

【中文标题】spring boot oauth2.0 和 spring security:如何通过 facebook 或 slack 授予用户登录权限(权限)【英文标题】:spring boot oauth2.0 and spring security: How to grant permission(authorities) to user login via facebook or slack 【发布时间】:2017-01-25 11:47:42 【问题描述】:

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

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

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

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

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

现在我的问题是

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于spring boot oauth2.0 和 spring security:如何通过 facebook 或 slack 授予用户登录权限(权限)的主要内容,如果未能解决你的问题,请参考以下文章

利用OAuth2.0来构建一个基于Spring Boot的安全的端到端通信应用

Spring Boot + OAuth2.0 实现微信扫码登录,这才叫优雅!!

Spring Cloud ?????????????????? OAuth2.0 ??????????????????

使用 Spring Boot 在单个浏览器会话中使用多个 OAuth2 客户端

基于Spring oauth2.0统一认证登录,返回自定义用户信息

Spring Boot 实现微信扫码登录,真香。。