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 登录的主要内容,如果未能解决你的问题,请参考以下文章