You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:20:27