Spring 安全 + OAuth,如果缺少访问令牌则回退
Spring Security + OAuth, fallback if access token absent
我在我的应用程序中使用 Spring 安全性来保护我的大部分端点。我正在使用 Spring Security OAuth2 来保护某个子集。
OAuth 保护端点的这个子集将被外部服务器和资源服务器本身的用户访问。
是否可以在此端点上同时拥有两种保护,并使用非此即彼的方式?如果用户从外部服务器访问端点,他们将需要一个 OAuth 访问令牌才能进入,如果用户直接登录到资源服务器,他们将没有访问令牌,但我想使用我的其他过滤器链做我的标准认证。
我以前从未见过带有两个独立过滤器链的 HTTP 块,但也许有一些我不知道的方法可以做到这一点。
我认为受保护的资源不需要 2 个过滤器链,只需要一些考虑到可能遇到的不同身份验证的访问规则。 sparklr2 demo 是一个资源服务器,例如在其 /photos 端点上接受 cookie 和令牌。在 sparklr 中,您有 1 个过滤器链(WebSecurityConfigurerAdapter
)用于登录和授权端点,1 个(ResourceServerConfigurerAdapter
)用于受保护的资源。默认情况下 ResourceServerConfigurerAdapter
在 之前 WebSecurityConfigurerAdapter
应用,因此它必须 不 匹配登录和授权资源。相关的匹配器和访问规则是这样的:
@Override
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
// Since we want the protected resources to be accessible in the UI as well we need
// session creation to be allowed (it's disabled by default in 2.0.6)
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.and()
.requestMatchers().antMatchers("/photos/**", "/oauth/users/**", "/oauth/clients/**","/me")
.and()
.authorizeRequests()
.antMatchers("/me").access("#oauth2.hasScope('read')")
.antMatchers("/photos").access("#oauth2.hasScope('read') or (!#oauth2.isOAuth() and hasRole('ROLE_USER'))")
...
}
此处您看到一个仅用于 OAuth 的资源 (/me
) 和一个根据访问规则使用令牌或 cookie (/photos
) 的资源。
我在我的应用程序中使用 Spring 安全性来保护我的大部分端点。我正在使用 Spring Security OAuth2 来保护某个子集。 OAuth 保护端点的这个子集将被外部服务器和资源服务器本身的用户访问。
是否可以在此端点上同时拥有两种保护,并使用非此即彼的方式?如果用户从外部服务器访问端点,他们将需要一个 OAuth 访问令牌才能进入,如果用户直接登录到资源服务器,他们将没有访问令牌,但我想使用我的其他过滤器链做我的标准认证。
我以前从未见过带有两个独立过滤器链的 HTTP 块,但也许有一些我不知道的方法可以做到这一点。
我认为受保护的资源不需要 2 个过滤器链,只需要一些考虑到可能遇到的不同身份验证的访问规则。 sparklr2 demo 是一个资源服务器,例如在其 /photos 端点上接受 cookie 和令牌。在 sparklr 中,您有 1 个过滤器链(WebSecurityConfigurerAdapter
)用于登录和授权端点,1 个(ResourceServerConfigurerAdapter
)用于受保护的资源。默认情况下 ResourceServerConfigurerAdapter
在 之前 WebSecurityConfigurerAdapter
应用,因此它必须 不 匹配登录和授权资源。相关的匹配器和访问规则是这样的:
@Override
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
// Since we want the protected resources to be accessible in the UI as well we need
// session creation to be allowed (it's disabled by default in 2.0.6)
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.and()
.requestMatchers().antMatchers("/photos/**", "/oauth/users/**", "/oauth/clients/**","/me")
.and()
.authorizeRequests()
.antMatchers("/me").access("#oauth2.hasScope('read')")
.antMatchers("/photos").access("#oauth2.hasScope('read') or (!#oauth2.isOAuth() and hasRole('ROLE_USER'))")
...
}
此处您看到一个仅用于 OAuth 的资源 (/me
) 和一个根据访问规则使用令牌或 cookie (/photos
) 的资源。