spring-boot - 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 登录。我有点迷路了,有什么想法吗?
谢谢!!
解决方案
您必须禁用自动配置以确保安全
在你的 Main 类中使用它
@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class})
推荐阅读
- javascript - 将多个文本区域存储在不同数组的索引中
- python - Python Pandas 将值分组为 2 列
- fork - 使用 systemd 时是否仍然需要在守护进程中分叉?
- ms-access - 将 Access 表中的数据转换为新表中的多行
- contentful - 脚本化迁移的内容最佳实践
- java - JVM LinkageError 和 Signature 区别
- angular - Angular 没有剪贴板的提供者
- python - Python 中的自定义错误
- c# - Xamarin XfxComboBox Show suggestion items on focus
- r - 计算R中数据表行中的唯一值