我需要带有 Spring Security OAuth2 的资源服务器吗?

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 吗?或者在两者之间拆分该配置? 两者分开。

以上是关于我需要带有 Spring Security OAuth2 的资源服务器吗?的主要内容,如果未能解决你的问题,请参考以下文章

带有Angularjs注销错误的Spring Boot

Spring security oauth 令牌提取

如何使用 redis 使用 spring-security-oauth2 持久化令牌

无法修复 spring-security-oauth2-resource-server 上的漏洞

我需要带有 Spring Security OAuth2 的资源服务器吗?

Spring Security - 只允许带有前缀的请求