Java Spring@EnableResourceServer vs@EnableOAuth2Sso

Java Spring@EnableResourceServer vs@EnableOAuth2Sso,java,spring,spring-security,spring-cloud,rest-security,Java,Spring,Spring Security,Spring Cloud,Rest Security,到目前为止,我阅读的大多数教程都使用API网关上的@enableAuth2sso而不是@EnableResourceServer。有什么区别?相比之下,OAuth2Sso做了什么 详细信息:我正在为基于spring的微服务和单页应用程序实施安全/基础架构。一段时间以来,虽然我们没有安全要求,但SPA直接与不同主机上的OpenMicroService(CORS方)进行对话 现在,我使用springoauth和springzuul添加了一层安全性和网关模式。因此,我有一个带有@EnableAutho

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

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

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


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

这些注释用不同的方式标记您的服务

@EnableResourceServer注释意味着您的服务(就OAuth 2.0-资源服务器而言)需要一个访问令牌来处理请求。在调用资源服务器之前,OAuth 2.0客户端应从授权服务器获取访问令牌

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

另外,如果您查看
@enableAuth2sso
注释的源代码,您将看到两件有趣的事情:

  • @enableAuth2Client
    。这就是您的服务成为OAuth 2.0客户端的地方。如果您通过OAuth2RestTemplate调用下游服务,则可以将访问令牌(在交换为授权代码后)转发到下游服务
  • @EnableConfigurationProperties(OAuth2ssProperties.class)
    。OAuth2ssoProperty只有一个属性
    String loginPath
    ,默认情况下为
    /login
    。这将通过
    OAuth2ClientAuthenticationProcessingFilter
    拦截对
    /login
    的浏览器请求,并将用户重定向到授权服务器
我应该使用@enableAuth2sso吗

这取决于:

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

我希望有人能给你一个答案——我几乎是同舟共济。据我所知,
enableAuth2sso
注释将添加一些http过滤器,理论上是“oauth感知的”。我有了这个想法,例如,它将自动从传入的请求中提取访问令牌并转发到后端服务。但是,我还没有做到这一点(事实上,到目前为止,注释对我来说只是破坏了一堆东西——我确信这是我缺乏知识,而不是注释!).我找不到一个文档来解释许多神奇的注释或类对oauth2的作用,所以你是如何理解所有这些的?大部分我是通过研究它们的源代码来理解的。此外,在这种情况下,实验也有很大帮助:)这两个注释背后的默认配置是什么?是否可以对其进行自定义?当使用@EnableOAuth2Sso时,它会触发ResourceServerTokenServices配置,该配置需要配置由ResourceServer使用的端点,如token_key。如何在我的客户端应用程序中使用这个漂亮的注释,而不需要提供资源信息?@DanyloZatorsky@eugene
@enableAuth2sso
真是老生常谈的东西,它给我带来了不推荐的错误,请建议我最新的工作替代方案,