【问题标题】:Do I need resource server with Spring Security OAuth2?我需要带有 Spring Security OAuth2 的资源服务器吗?
【发布时间】:2018-07-15 16:54:24
【问题描述】:

我正在尝试使用 JWT 令牌实现 OAuth2 身份验证。如果我理解,我需要将凭据发送到授权服务器,这会验证我的凭据,然后返回签名的 JWT 令牌。接下来我尝试实现扩展WebSecurityConfigurerAdapterWebSecurityConfig,我必须设置哪些端点是安全的,哪些不是。

但我的问题是:我需要资源服务器吗?它和我的潜在WebSecurityConfig 做同样的工作,或者没有?

我的目标是为我的网站创建简单的 JWT 身份验证。

【问题讨论】:

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


    【解决方案1】:

    你需要资源服务器,因为它是OAuth2 spec的一部分:

    资源服务器

    托管受保护资源的服务器,能够接受 并使用访问令牌响应受保护的资源请求。

    因此它也是 Spring Security OAuth2 的一部分。

    资源服务器配置不仅仅是安全配置,见OAuth 2 Developers Guide

    资源服务器配置

    资源服务器(可以与授权服务器相同或单独的应用程序)提供受 OAuth2 令牌保护的资源。 Spring OAuth 提供了实现此保护的 Spring Security 身份验证过滤器。您可以在@Configuration 类上使用@EnableResourceServer 将其打开,并使用ResourceServerConfigurer 对其进行配置(根据需要)。可以配置以下功能:

    • tokenServices:定义令牌服务的 bean(ResourceServerTokenServices 的实例)。
    • resourceId:资源的 ID(可选,但建议使用,如果存在,将由身份验证服务器验证)。
    • 资源服务器的其他扩展点(例如,用于从传入请求中提取令牌的 tokenExtractor)
    • 为受保护资源请求匹配器(默认为全部)
    • 受保护资源的访问规则(默认为纯“已验证”)
    • Spring Security 中 HttpSecurity 配置器允许的受保护资源的其他自定义

    @EnableResourceServer 注解会自动将OAuth2AuthenticationProcessingFilter 类型的过滤器添加到 Spring Security 过滤器链中。

    您可以将 Spring Security 配置 (WebSecurityConfigurerAdapter) 用于 Spring Security 中 HttpSecurity 配置器允许的受保护资源的其他自定义,但最好使用资源服务器配置,因为的:

    • 封装(资源服务器的所有配置在一个类中)
    • 配置顺序(您不必更改顺序)
    • 复杂性(一个类而不是两个类)

    这是推荐的方式。

    【讨论】:

      【解决方案2】:

      是的,您需要通过扩展 ResourceServerConfigurerAdapter 来配置受 JWT 保护的资源。基本实现可能如下所示

      @Configuration
      @EnableResourceServer
      public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
      
          @Override
          public void configure(HttpSecurity http) throws Exception {
              http
                  .authorizeRequests()
                  .anyRequest().authenticated()
                  .and()
                  .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
          }
      
      }
      

      这意味着您不需要扩展WebSecurityConfigurerAdapter,因为上述配置配置了与您将在WebSecurityConfigurerAdapter 中配置相同的HttpSecurity 对象。 public void configure(HttpSecurity http) 在两个类中的作用相同。

      我们之所以要选择ResourceServerConfigurerAdapter 而不是WebSecurityConfigurerAdapter,是因为它是您正在使用的 spring-security-oauth2 模块的一部分,并且将被框架在幕后使用。

      您当然需要确保对授权服务器和资源服务器使用相同的签名密钥。如果您在同一个应用程序中定义安全配置 bean,则资源服务器将自动使用相同的 bean,否则您将需要复制您在授权服务器上拥有的任何 JWT 相关配置。

      【讨论】:

        【解决方案3】:

        我将尝试用一个示例来回答:假设您想编写一个很棒且很酷的 Web 应用程序,它可以以某种方式同时管理 GMAIL 帐户以及 Google 日历数据。显然,您的用户必须使用他们的 google 凭据登录,这样您的应用才能获取他们的数据并对其进行管理。您的应用程序管理用户的数据,而无需获取用户的凭据。

        到目前为止一切顺利。

        在本例中,Authorization-Server 是 Google 帐户。 Resource Server 是 Google-Main 和 Google-Calendar(两者),Client 是您的应用程序。

        希望这是有道理的。

        【讨论】:

        • 谢谢,我想我明白为什么需要 ResourceServer,但它包含配置 HttpSecurity 参数的配置方法,与扩展 WebSecurityConfigurerAdapter 的类相同。那么我应该只使用 ResourceServer 而不是 WebSecurityConfigurerAdapter 吗?或者在两者之间拆分该配置?
        • 两者分开。
        猜你喜欢
        • 2013-12-21
        • 2019-11-27
        • 2017-03-25
        • 2018-08-17
        • 2017-12-15
        • 2018-07-08
        • 2021-10-29
        • 2020-10-28
        • 2022-11-23
        相关资源
        最近更新 更多