首页 > 解决方案 > Keycloak 登录页面未显示,我改为获取 Spring Security 登录

问题描述

嗨,我正在尝试使用我已经开始的 Java 15 为 Kotlin Spring Boot 项目添加安全性。我想使用 Keycloak 作为 Auth Server。

我还没有前端(REACT 应用程序),我先构建 REST API。

我的问题是,当我尝试访问受保护的端点而不是 Keycloak 登录页面时,我认为 Spring Security 登录页面会弹出,因为它显示凭据无效,并且外观是基本形式,而不是 Keycloak 用于登录的样式。我不知道我的配置中缺少什么。

这是安全配置:

@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = [KeycloakSecurityComponents::class])
internal class SecurityConfig : KeycloakWebSecurityConfigurerAdapter() {
    @Autowired
    fun configureGlobal(auth: AuthenticationManagerBuilder) {
        val keycloakAuthenticationProvider: KeycloakAuthenticationProvider =
            keycloakAuthenticationProvider()
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(
            SimpleAuthorityMapper()
        )
        auth.authenticationProvider(keycloakAuthenticationProvider)
    }

    @Bean
    fun keycloakConfigResolver(): KeycloakSpringBootConfigResolver {
        return KeycloakSpringBootConfigResolver()
    }

    @Bean
    override fun sessionAuthenticationStrategy(): SessionAuthenticationStrategy {
        return RegisterSessionAuthenticationStrategy(
            SessionRegistryImpl()
        )
    }

    override fun configure(http: HttpSecurity) {
        super.configure(http)
        http.authorizeRequests()
            .antMatchers("/carts*")
            .hasRole("user")
            .anyRequest()
            .permitAll()
    }
}

控制器:

@RestController
@RequestMapping("/carts")
class CartController(private val cartService: CartService) {

    @GetMapping("/{id}")
    fun getCart(@PathVariable id: String): Cart? {
        return cartService.findById(id)
    }
}

应用程序-yml:

keycloak:
  auth-server-url: http://localhost:8081/auth
  realm: TestRealm
  resource: login-app
  public-client: true
  principal-attribute: preferred_username

build.gradle 依赖:

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-data-mongodb")
    implementation("org.springframework.boot:spring-boot-starter-security")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.12.+")
    implementation("org.keycloak:keycloak-spring-boot-starter")
    developmentOnly("org.springframework.boot:spring-boot-devtools")
    annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.springframework.security:spring-security-test")
    testImplementation("io.mockk:mockk:1.10.6")
}

dependencyManagement {
    imports {
        mavenBom("org.keycloak.bom:keycloak-adapter-bom:12.0.4")
    }
}

当我进行直接请求时,我得到了一个有效的令牌,所以我假设 Keycloak 正在工作(我在端口 8081 的 docker 容器上运行它)。

curl --location --request POST 'http://localhost:8081/auth/realms/TestRealm/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=login-app' \
--data-urlencode 'username=user2' \
--data-urlencode 'password=user2' \
--data-urlencode 'grant_type=password'

对“localhost:8080/carts/605271fa9f2ad0418ca4858d”的请求重定向到“http://localhost:8080/login”,这显示:

春季安全登录

相反,我期望与此类似(取自另一个示例): 在此处输入图像描述

我看到的每个指南都被重定向到开箱即用的 Keycloak 登录。我有点迷路了,有什么想法吗?

谢谢!!

标签: spring-bootkotlinspring-securitykeycloak

解决方案


您必须禁用自动配置以确保安全

在你的 Main 类中使用它

@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class})

推荐阅读