【问题标题】:SSO in OAuth2Client in Spring Boot SecuritySpring Boot Security 中 OAuth2Client 中的 SSO
【发布时间】:2019-08-21 20:28:11
【问题描述】:

我一直在阅读有关 Spring Security 中的 OAuth2 集成以及如何通过第三方身份提供者(例如 Google)实现身份验证/授权。

我使用@EnableOauth2Sso 注释实现了SSO 登录,并将以下内容添加到我的application.properties

security:
  oauth2:
    client:
      clientId: 8d...f5e
      clientSecret: 2d...1b
      accessTokenUri: https://sso.domain.com/oauth/token
      userAuthorizationUri: https://sso.domain.com/oauth/authorize
      scope: openid
    resource:
      userInfoUri: https://sso.domain.com/userinfo

这似乎太神奇了,我不知道引擎盖下发生了什么。按照 Spring 官方网站上Manual Configuration of OAuth2 Client 的指南,我看到它切换到@EnableOauth2Client 而不是@EnableOauth2Sso,它说:

首先,我们可以注入 OAuth2ClientContext 并使用它来构建我们添加到安全配置中的身份验证过滤器

OAuth2ClientContext 是什么?我查看了官方API Docs,它只是说它是一个接口,但仍然不确定它到底是什么以及它是如何使用的。

是我遗漏了什么还是官方文档不足?我仍然无法掌握 OAuth2ClientContext、OAuth2ClientAuthenticationProcessingFilter 和 OAuth2RestTemplate 如何协同工作以通过 SSO 在 Spring 中执行身份验证。

请指出任何正确的文档部分以掌握基本知识。提前致谢。

【问题讨论】:

  • 您需要 Oauth2 客户端示例吗?你不会找到太多关于这个主题的文档,一个例子是最好的。
  • @EugenCovaci 示例也很好。我的目标是了解在没有魔法注释的情况下这是如何在内部发生的。有了这些知识,我想在身份验证后自定义一些方面。我觉得很奇怪,它没有记录不同的部分是如何工作的。
  • 我能找到的最好的就是这个:baeldung.com/spring-security-oauth2-authentication-with-reddit 但它很臃肿,它没有提供必要的东西。
  • 这个baeldung.com/spring-oauth-login-webflux 是为WebFlux 准备的。如果你等到明天,我会为 Spring Web 做一个简单的例子。

标签: java spring spring-boot spring-security spring-security-oauth2


【解决方案1】:

这是一个可以运行的example。它根据授权服务器对客户端进行身份验证,并从资源服务器访问受保护的资源。

我仍在努力记录源代码并完成自述文件。如果您有任何问题,请随时问我。

【讨论】:

  • 看起来很有帮助。我只是对此进行了高级视图,看起来您正在使用HttpSecurity.oauth2login() 进行客户端实现。通过Spring Boot Guide 我注意到它手动创建了一个过滤器来登录受保护的服务器。如果我理解正确,客户端会对 userinfo 端点进行OAuthRestTemplate 调用以加载身份验证对象。如果我想自定义这个对象怎么办?我看到有一些PrincipalExtractor 接口的引用,这适用于您的解决方案吗?
  • @int-main 似乎手动创建该过滤器可以让您更好地控制该过程。关于 PrincipalExtractor 接口,我认为没有理由不工作,请随意尝试,这里有一个示例:baeldung.com/…。关于“对 userinfo 端点的调用”实际上它并没有调用加载 Authentication 对象,它想要的只是作为字符串调用的结果(我不确定我是否正确理解了你的问题)。
  • 您的存储库帮了大忙。我能够使用您的示例作为参考,通过HttpSecurity.oauth2Login() 实现 SSO 登录。还有一个问题,这将对任何拥有 SSO 服务帐户的人进行身份验证。现在我如何实现特定于应用程序的过滤(检查他们是否有权访问)。示例:网站允许您使用 Google 登录,如果您的帐户不存在,它们会通过注册流程。如果是HttpSecurity.oauth2Login(),那将如何完成。这就是我在寻找PrincipalExtractor 接口的目的。
  • @int-main 好消息。你说Websites let you sign in with Google and if your account doesn't exist, they go through sign up flow.。实际上,这并不准确。登录/注册过程完全由授权服务器负责 - 客户端应用程序不知道用户直接执行登录或先进行注册这一事实。不幸的是,没有开箱即用的注册功能,因此您必须实现一个(通过使用自定义登录页面并在登录表单下方添加指向注册页面的链接)。
  • 我可能说得不好。我的意思是虽然网站通过第三方提供商登录,但它们确实需要本地数据库中的用户帐户。自从我发布最后一条评论以来,我遇到了UserInfoEndpointConfig,它允许自定义版本的userService(类似于PrincipalExtractor)。好像这是用户第一次访问时的处理方式。
猜你喜欢
  • 2013-11-20
  • 2021-12-15
  • 2019-08-05
  • 2017-10-24
  • 2022-12-14
  • 2017-06-20
  • 2015-12-28
  • 1970-01-01
相关资源
最近更新 更多