Keycloak 登录页面未显示,我改为获取 Spring Security 登录

Posted

技术标签:

【中文标题】Keycloak 登录页面未显示,我改为获取 Spring Security 登录【英文标题】:Keycloak login page not showing, I get Spring Security login instead 【发布时间】:2021-06-19 05:21:20 【问题描述】:

您好,我正在尝试使用我已经启动的 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 登录。我有点迷路了,有什么想法吗?

谢谢!!

【问题讨论】:

【参考方案1】:

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

在你的主类中使用它

@EnableAutoConfiguration(exclude =  SecurityAutoConfiguration.class)

【讨论】:

【参考方案2】:

因为没有将包添加到我的 SecurityConfig(从其他地方复制示例并且可能覆盖了包定义)类而丢失了下午,因此组件扫描完全跳过了这个配置。

尽管如此,我让它工作的方式是直接向 keycloak url 请求令牌并使用标头 --header 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiA...' 发送它。

我猜 Keycloak 登录页面是我稍后必须直接从前端配置的东西,因为我没有使用 Spring MVC

【讨论】:

以上是关于Keycloak 登录页面未显示,我改为获取 Spring Security 登录的主要内容,如果未能解决你的问题,请参考以下文章

创建 keycloak 自定义主题

Next.js:在重定向到 Keycloak 登录页面之前阻止显示索引页面

在 keycloak 登录页面上显示应用程序名称

Keycloak 在硬页面刷新后就像未初始化一样

如何将keycloak重定向到应用程序页面并获取令牌

使用 keycloak 保护特定的反应页面