Spring OAuth2授权服务器:限制OAuth2端点仅对OAUTH2权限用户开放
解决方案:限制Spring OAuth2授权服务器端点仅对拥有OAUTH2权限的用户开放
问题核心在于优先级更高的授权服务器过滤器链(Order(1))已经默认处理了所有/oauth2相关端点,导致你在Order(2)的默认过滤器链中配置的/oauth2/**权限规则根本不会被执行。要实现需求,必须在授权服务器自身的过滤器链中添加权限控制。
步骤1:修改授权服务器过滤器链
在authorizationServerSecurityFilterChain中直接对OAuth2端点添加权限校验,替代默认的开放规则:
@Bean @Order(1) SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); // 启用OIDC(如果不需要可移除) http.getConfigurer(OAuth2AuthorizationServerConfigurer.class).oidc(withDefaults()); // 核心:为OAuth2授权服务器端点添加权限控制 http.authorizeHttpRequests(authorize -> authorize // 匹配所有OAuth2授权服务器端点(/oauth2/authorize、/oauth2/token、/oauth2/jwks等) .requestMatchers(OAuth2AuthorizationServerConfiguration.getEndpointsMatcher()) // 要求用户拥有OAUTH2权限才能访问 .hasAuthority("OAUTH2") ); http.oauth2ResourceServer(resourceServer -> resourceServer.jwt(withDefaults())); // 未认证用户访问授权端点时,跳转到登录页 http.exceptionHandling(exceptions -> exceptions.defaultAuthenticationEntryPointFor( new LoginUrlAuthenticationEntryPoint("/login"), new AntPathRequestMatcher("/oauth2/authorize") )); return http.build(); }
步骤2:调整默认应用过滤器链
移除默认过滤器链中无效的/oauth2/**规则,保留应用端点的权限控制:
@Bean @Order(2) SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authorize -> authorize .requestMatchers("/login", "/actuator/**").permitAll() // 所有应用端点要求USER权限 .anyRequest().hasAuthority("USER") ) .formLogin(Customizer.withDefaults()); return http.build(); }
特殊情况处理:/oauth2/token端点
如果你的服务需要支持Client Credentials授权模式(客户端直接请求token,无需用户登录),需要调整权限表达式,允许通过客户端认证的请求:
// 替换authorizeHttpRequests中的对应规则 .requestMatchers("/oauth2/token") .access("(isAuthenticated() and hasAuthority('SCOPE_client')) or hasAuthority('OAUTH2')")
解释:
hasAuthority('SCOPE_client'):匹配通过客户端认证的请求(Client Credentials模式)hasAuthority('OAUTH2'):匹配已登录且拥有OAUTH2权限的用户请求(如密码/授权码模式)
关键注意事项
- 确保你的
UserDetailsService实现中,为需要访问OAuth2端点的用户正确添加OAUTH2权限。 - 授权服务器过滤器链的
@Order(1)优先级必须高于应用过滤器链的@Order(2),否则规则会被覆盖。
内容的提问来源于stack exchange,提问作者kcsurapaneni
相关产品推荐
相关产品推荐

