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

Spring Boot 3中/public/info端点免鉴权配置无效问题求助

问题:特定端点/public/info始终被重定向到Keycloak,无法匿名访问

我希望/public/info端点无需认证即可访问,但当前访问时总是被重定向到Keycloak登录页面。

我的application.yaml配置

spring:
  application:
    name: team1
  security:
    oauth2:
      client:
        provider:
          # provider name used for registration
          demo:
            # Keycloak realm URL: "{keycloak-url}/realms/{realm-name}"
            issuer-uri: 
        registration:
          # client-id from Keycloak client configuration
          demo-client:
            # provider from above
            provider: demo
            # client-id from Keycloak client configuration
            client-id:
            client-secret:
            scope: openid
            authorization-grant-type: authorization_code
            redirect-uri:

server:
  port: 8080

我的SecurityConfiguration代码

@Configuration
@EnableWebSecurity
class SecurityConfiguration{

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authorize -> {
                authorize.requestMatchers("/public/info").permitAll();
                authorize.anyRequest().authenticated();}
            ).oauth2Login(Customizer.withDefaults());
        return http.build();
    }
   
}

/public/info端点实现

@GetMapping(path = "/public/info")
public String hello() {
    return "Hello";
}

我的build.gradle配置(可能版本存在问题)

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.3.0'
    id 'io.spring.dependency-management' version '1.1.5'
}

group = 'at.ac.fhwn'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
    useJUnitPlatform()
}

解决方案

从以下几个角度排查修复:

1. 调整Security配置规则细节

Spring Security按规则顺序匹配,确保permitAll优先级高于全局认证规则。同时,可忽略该端点的CSRF检查(GET请求默认不受CSRF限制,但避免潜在冲突):

修改后的SecurityConfiguration:

@Configuration
@EnableWebSecurity
class SecurityConfiguration {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf.ignoringRequestMatchers("/public/info"))
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/public/info").permitAll()
                .anyRequest().authenticated()
            )
            .oauth2Login(Customizer.withDefaults());
        return http.build();
    }
}

2. 确认端点路径匹配

检查控制器的@GetMapping路径是否与请求匹配,若应用配置了server.servlet.context-path,需在requestMatchers中加上对应前缀(比如/app/public/info)。

3. 验证版本兼容性

Spring Boot 3.3.0与Java 21兼容,依赖管理插件已对齐版本。可清理缓存后重新构建:

./gradlew clean build

4. 排查Keycloak配置影响

即使Keycloak配置项为空,OAuth2 Client过滤器仍可能生效。检查是否存在其他SecurityFilterChain Bean,或配置文件中是否有强制全局认证的设置。

测试验证

重启应用后访问http://localhost:8080/public/info,应直接返回Hello,不再跳转Keycloak登录页。

内容的提问来源于stack exchange,提问作者nikolardlvc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:17:04