【问题标题】:Spring @EnableResourceServer vs @EnableOAuth2SsoSpring @EnableResourceServer 与 @EnableOAuth2Sso
【发布时间】:2017-08-13 19:23:16
【问题描述】:

到目前为止,我阅读的大多数教程都在 API 网关上使用 @EnableOAuth2Sso 而不是 @EnableResourceServer。有什么区别?相比之下,OAuth2Sso 做了什么?

详细信息:我正在为基于 spring 的微服务和单页应用程序实施安全/基础架构。一段时间以来,虽然我们没有安全要求,但 SPA 直接与不同主机(CORS 方)上的开放微服务对话。

现在我正在使用spring-oauthspring-zuul 添加一层安全性和网关模式。所以我有一个带有@EnableAuthorizationServer 的服务(uaa-service)和一个带有@EnableZuulProxy@EnableResourceServer 的网关。我只需要 password 授权类型,因此每个 SPA 都有自己的登录表单,并通过网关使用 uaa-service 令牌端点进行身份验证,然后继续使用该令牌进行进一步的请求。

这种方法有什么问题吗?我应该使用@EnableOAuth2Sso吗?

【问题讨论】:

  • 我希望有人能给你一个答案 - 我几乎在同一条船上。尽我所能,EnableOAuth2Sso 注释将添加一些 http 过滤器,理论上将是“oauth 感知”的。我得到了这个想法,例如,它会自动从传入的请求中获取访问令牌并转发到后端服务。但是,我还没有做到这一点(事实上,到目前为止,注释对我来说只是破坏了一堆东西——我确信这是我缺乏知识而不是注释!)。

标签: java spring spring-security spring-cloud rest-security


【解决方案1】:

这些注释用不同的OAuth 2.0 roles 标记您的服务。

@EnableResourceServer 注释意味着您的服务(根据 OAuth 2.0 - 资源服务器)需要访问令牌才能处理请求。访问令牌应由 OAuth 2.0 客户端在调用资源服务器之前从授权服务器获取。

@EnableOAuth2Sso: 将您的服务标记为 OAuth 2.0 客户端。这意味着它将负责将资源所有者(最终用户)重定向到用户必须输入其凭据的授权服务器。完成后,用户将使用授权码重定向回客户端(不要与访问码混淆)。然后客户端获取授权码并通过调用授权服务器将其交换为访问令牌。只有在此之后,客户端才能使用访问令牌调用资源服务器。

另外,如果你看一下@EnableOAuth2Sso注解的源代码,你会发现两个有趣的东西:

  • @EnableOAuth2Client。这是您的服务成为 OAuth 2.0 客户端的地方。如果您通过OAuth2RestTemplate 调用这些服务,则可以将访问令牌(在交换为授权码之后)转发给下游服务。
  • @EnableConfigurationProperties(OAuth2SsoProperties.class)。 OAuth2SsoProperties 只有一个属性String loginPath,默认为/login。这将拦截OAuth2ClientAuthenticationProcessingFilter/login 的浏览器请求,并将用户重定向到授权服务器。

我应该使用@EnableOAuth2Sso 吗?

这取决于:

  • 如果您希望 API 网关成为 OAuth 2.0 客户端,使用 授权码流资源所有者密码凭证流 与浏览器交互,那么答案是肯定的,你可能应该。我说可能是因为我不确定@EnableOAuth2Sso 是否很好地支持资源所有者密码凭据流。无论如何,我建议您使用授权代码流,除非您真的(真的!)有充分的理由不这样做。顺便说一句,在使用授权代码流时,您可能希望将下游微服务标记为 @EnableResourceServer。然后 API 网关将是 OAuth 2.0 客户端,而您的微服务将是 OAuth 2.0 资源服务器,这在我看来是合乎逻辑的。
  • 如果您不需要与浏览器交互(例如 Client Credentials Flow)或者您有使用 Implicit Flow 的 SPA,那么您应该使用 @EnableResourceServer,这意味着它将仅接受具有有效访问令牌的请求。

【讨论】:

  • 您是如何弄清楚这一切的,因为我找不到解释许多神奇注释或类为 oauth2 做了什么的文档?
  • 大部分是我通过调查他们的源代码发现的。此外,在这种情况下,实验也有很大帮助:)
  • 这两个注解背后的默认配置是什么?可以定制吗?
  • 当使用 @EnableOAuth2Sso 时,它会触发 ResourceServerTokenServicesConfiguration,它需要配置像 token_key 这样的端点,供 ResourceServer 使用。如何在我的客户端应用程序中使用这个漂亮的注解而不需要提供资源信息?
猜你喜欢
  • 2016-08-31
  • 2018-12-14
  • 2017-10-28
  • 2023-03-19
  • 2018-08-16
  • 1970-01-01
  • 2016-02-18
  • 2019-01-05
  • 2017-09-09
相关资源
最近更新 更多