Spring Boot 2.0 OAuth2授权服务器与资源服务器配置异常求助
问题分析与解决方案
你遇到的核心问题是资源服务器的安全规则没有被优先执行,反而被默认的WebSecurity配置拦截,导致所有请求都被导向登录页。结合Spring Boot 2.0.0和Spring Security OAuth2 2.3.0的版本特性,我整理了几个常见原因和对应的解决办法:
1. 配置类的Order顺序冲突
你给WebSecurity配置加了@Order(1),但资源服务器注解@EnableResourceServer的默认Order值是3,这会导致WebSecurity的规则先匹配,直接覆盖了资源服务器的认证逻辑。
解决办法:
- 给资源服务器配置类设置更低的Order值(比如
@Order(0)),让它的规则优先被执行:
@Configuration @EnableResourceServer @Order(0) public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/sample").authenticated(); // 明确指定该端点需要Token认证 } }
- 同时把WebSecurity的Order调整为更高的值(比如
@Order(2)),让它只处理授权相关的端点(比如登录页、授权页):
@Configuration @Order(2) @EnableWebSecurity(debug = true) protected static class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/login", "/oauth/authorize").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") // 你的自定义登录页路径 .permitAll(); } }
2. 资源服务器未正确配置Token解析
如果资源服务器无法识别请求携带的Token,会默认判定请求未认证,进而触发重定向到登录页。
解决办法:
如果你的授权服务器和资源服务器是同一应用,确保资源服务器能访问Token存储;如果是分离应用,推荐用JWT或远程Token校验。这里以JWT为例:
@Configuration @EnableResourceServer @Order(0) public class ResourceServerConfig extends ResourceServerConfigurerAdapter { // 配置JWT Token解析器,密钥要和授权服务器一致 @Bean public JwtAccessTokenConverter jwtAccessTokenConverter() { JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); converter.setSigningKey("your-shared-secret-key"); return converter; } @Bean public TokenStore tokenStore() { return new JwtTokenStore(jwtAccessTokenConverter()); } @Override public void configure(ResourceServerSecurityConfigurer resources) throws Exception { resources.tokenStore(tokenStore()); } @Override public void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMatchers("/sample").authenticated(); } }
3. 让WebSecurity放行资源端点
可以在WebSecurity配置中对资源服务器负责的端点直接放行,避免它提前拦截:
@Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/sample").permitAll() // 交给资源服务器处理认证 .antMatchers("/login", "/oauth/authorize").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll(); }
4. 利用Debug模式排查Filter链
你已经开启了@EnableWebSecurity(debug = true),可以查看控制台输出的Filter执行顺序,确认OAuth2AuthenticationProcessingFilter(资源服务器核心Filter)是否在UsernamePasswordAuthenticationFilter(WebSecurity的登录Filter)之前执行。如果顺序不对,调整Order值即可。
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

