我需要带有 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 令牌。接下来我尝试实现扩展WebSecurityConfigurerAdapter
的WebSecurityConfig
,我必须设置哪些端点是安全的,哪些不是。
但我的问题是:我需要资源服务器吗?它和我的潜在WebSecurityConfig
做同样的工作,或者没有?
我的目标是为我的网站创建简单的 JWT 身份验证。
【问题讨论】:
【参考方案1】:你需要资源服务器,因为它是OAuth2 spec的一部分:
资源服务器
托管受保护资源的服务器,能够接受 并使用访问令牌响应受保护的资源请求。
因此它也是 Spring Security OAuth2 的一部分。
资源服务器配置不仅仅是安全配置,见OAuth 2 Developers Guide:
资源服务器配置
资源服务器(可以与授权服务器相同或单独的应用程序)提供受 OAuth2 令牌保护的资源。 Spring OAuth 提供了实现此保护的 Spring Security 身份验证过滤器。您可以在
tokenServices:定义令牌服务的 bean(ResourceServerTokenServices 的实例)。 resourceId:资源的 ID(可选,但建议使用,如果存在,将由身份验证服务器验证)。 资源服务器的其他扩展点(例如,用于从传入请求中提取令牌的 tokenExtractor) 为受保护资源请求匹配器(默认为全部) 受保护资源的访问规则(默认为纯“已验证”) Spring Security 中 HttpSecurity 配置器允许的受保护资源的其他自定义@Configuration
类上使用@EnableResourceServer
将其打开,并使用ResourceServerConfigurer
对其进行配置(根据需要)。可以配置以下功能:
@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 的资源服务器吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 redis 使用 spring-security-oauth2 持久化令牌
无法修复 spring-security-oauth2-resource-server 上的漏洞