具有基本身份验证和 OAuth 顺序问题的 Spring Boot 安全性
Posted
技术标签:
【中文标题】具有基本身份验证和 OAuth 顺序问题的 Spring Boot 安全性【英文标题】:Spring Boot Security with Basic Auth and OAuth Order Issue 【发布时间】:2018-09-01 21:05:17 【问题描述】:我正在尝试实现一个简单的 Spring Boot 项目。我有几个 REST 端点,我必须以不同的方式保护它们。一个必须由 Basic Auth 保护,另一个需要 OAuth 保护,另一个需要自定义安全实现。
REST 端点:
/basic/auth /application/secure (oauth) /application/secure2(自己的实现)从教程中,我知道我必须设置安全适配器的顺序。我的第一个意图是以十为步长设置顺序(例如@Order(10)
、@Order(20)
),以防我需要在其间添加其他安全过滤器。通过这样做,我调查了以下行为:
@Order(10)
的基本身份验证过滤器和带有@Order(20)
的OAuth 过滤器,则只有OAuth 过滤器有效。
如果我添加带有 @Order(1)
或 @Order(2)
的基本身份验证过滤器和带有 @Order(4)
的 OAuth 过滤器,这两个过滤器都可以工作。
如果我向@Order(3)
添加过滤器,我会收到一条错误消息,指出订单 3 已在使用中,无法配置两次。
所以有一个默认的 spring 安全适配器(或其他),它的默认顺序是 3。我想我通过添加 @EnableWebSecurity
来禁用每个默认的 spring 安全行为。在我没有找到谷歌的答案后,我的问题是:
WebSecurityConfig:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig
@Order(10)
@Configuration
public class BasicAuthConfig extends WebSecurityConfigurerAdapter
@Value("$security.user.password")
private String password;
@Value("$security.user.name")
private String username;
private static final String ROLE_ADMIN = "ADMIN";
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception
auth.inMemoryAuthentication().withUser(username).password(password).roles(ROLE_ADMIN);
@Override
protected void configure(HttpSecurity http) throws Exception
http.csrf().disable();
http.requestMatchers().antMatchers("/basic/**", "/") //
.and().authorizeRequests().anyRequest().authenticated() //
.and().httpBasic();
@Order(20)
@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
protected static class Oauth2ServerConfig extends ResourceServerConfigurerAdapter
@Override
public void configure(HttpSecurity http) throws Exception
System.out.println("Filter called");
// @formatter:off
http.csrf().disable();
http.authorizeRequests().antMatchers("/application/**").authenticated()
// .antMatchers(GET, "/application/secure").authenticated()
.anyRequest().authenticated();
// @formatter:on
// offline token validator
【问题讨论】:
见***.com/a/49429040/5277820 mh,我仍然不明白为什么如果order
设置为比 3 更大的值,则不会调用新的 WebSecurityConfigurerAdapter
。不应该在之后调用或匹配何时调用请求路径?由@EnableResourceServer
创建的WebSecurityConfigurerAdapter
是否会覆盖所有其他WebSecurityConfigurerAdapter
?这意味着我在使用 @EnableResourceServer
时仅限于两个过滤器。
重要的是要理解,只应用一种配置。链中的第一个匹配请求。其他所有内容均未应用。
不,对于BasicAuthConfig
,它是/basic/**
和/
,对于Oauth2ServerConfig
,它是/**
。
见***.com/questions/33603156/…和***.com/a/41527591/5277820。
【参考方案1】:
这是一个老问题,但如果有人仍然想知道问题是什么,以下是我的观察:
@EnableResourceServer
导入 ResourceServerConfiguration
,其顺序为 3。
有一些方法可以让您在 order 3
资源服务器配置器之前添加超过 2 个过滤器,例如
通过给其中一些负序值(虽然我不认为负值有什么特别之处,但需要考虑其他隐含的web security configurers - 例如订单为 0 的那个 - 启用默认值。然而,这意味着随着新功能的引入,不同版本框架中的过滤器之间可能会发生冲突);
通过将它们添加为资源配置器(ResourceServerConfiguration
类不会添加任何请求匹配器,但如果用户未配置任何内容,则会强制回退到 anyRequest().authenticated()
。
为了更好地了解路径在配置的请求匹配器中的匹配方式,您可以快速浏览Ant path patterns。
【讨论】:
以上是关于具有基本身份验证和 OAuth 顺序问题的 Spring Boot 安全性的主要内容,如果未能解决你的问题,请参考以下文章
具有基本身份验证和自定义 UserDetailsService 的 Spring Boot OAuth2