Keycloak 与 Spring boot 集成,使用自定义登录页面(在没有 keycloak 的默认登录页面的情况下登录)

Posted

技术标签:

【中文标题】Keycloak 与 Spring boot 集成,使用自定义登录页面(在没有 keycloak 的默认登录页面的情况下登录)【英文标题】:Keycloak Integration with Spring boot, using custom login page (Signing in without keycloak's default login page) 【发布时间】:2019-06-10 09:33:30 【问题描述】:

我想要达到的目标: 用户可以使用我们项目的登录页面(项目内)登录,而无需重定向到 keycloak 的默认登录页面。我已经使用 Keycloak 配置了 Spring Security,它工作正常但用户通过 keycloak 的默认登录页面登录

我的问题:我怎样才能实现这个功能,我将使用 REST API 从 Keycloak 获取令牌

   curl \
  -d "client_id=id-client" \
  -d "username=username" \
  -d "password=psw" \
  -d "grant_type=password" \
  -d "client_secret=secret" \
  "http://localhost:8080/auth/realms/myRealmName/protocol/openid-connect/token"

并允许访问我的 Spring 项目(无论是 Spring 安全性)

据我了解,我可以在前端使用 jquery 登录并获取令牌,最终传递给 spring security 或其他任何东西

任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

我们已经找到了解决这个问题的好方法,我将逐步解释: 首先,如果您想使用自定义登录页面,您有两种选择: 1.修改现有的keycloak主题,如登录/注册/密码更新,可以通过/keycloak/themes/*目录找到 2.这可能有点棘手-可以通过在您的项目中修改Spring Security的AuthenticationProvider来实现。

override fun configure(http: HttpSecurity?) 
        http
            ?.authorizeRequests()
            ?.antMatchers("/**")?.authenticated()
            ?.and()
            ?.authenticationProvider(myAuthenticationProvider)
            ?.formLogin()
            ?.loginPage("/login")
            ?.successHandler  request, response, authentication ->  redirectStrategy.sendRedirect(request, response, "/main")
            ?.permitAll()
            ?.usernameParameter("username") //the username parameter in the queryString, default is 'username'
            ?.passwordParameter("password") //the password parameter in the queryString, default is 'password'
            ?.and()
            ?.logout()
            ?.logoutUrl("/logout") //the URL on which the clients should post if they want to logout
            ?.invalidateHttpSession(true)
            ?.and()
            ?.exceptionHandling()
    

MyAuthenticationProvider 你应该重写这个 spring 安全类

我在上面的问题中还问过一件事,如果我使用 rest api 访问 spring 项目,在这种情况下你应该实现 KeycloakWebSecurityConfigurerAdapter 而不是 WebSecurityConfigurerAdapter

【讨论】:

如果有什么不懂的可以随时联系我))

以上是关于Keycloak 与 Spring boot 集成,使用自定义登录页面(在没有 keycloak 的默认登录页面的情况下登录)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中将 keycloak 与不同的上下文根和反向代理集成

java.lang.IllegalStateException:当我尝试将 keycloak 与 spring boot web + spring security 项目集成时,当前用户主体不是类型

Spring-boot 和 Keycloak 集成

Keycloak - spring boot - 外部登录网页

如何将 Keycloak 与 Spring 集成(无引导)?

通过 Spring Boot Keycloak 集成的 OAuth2 客户端凭据流