Обновление: отключение аутентификации и авторизации клиента больше не будет отображать сообщение 401, но защищенные конечные точки будут возвращать 403.
Я пытаюсь интегрировать основную версию keycloak: 20.0.2, работающую из контейнера докеров. Я начал следить за https://www.baeldung.com/spring-boot-keycloak но после нескольких предложений из разных тем я не могу заставить интеграцию работать.
свойства приложения:
keycloak.auth-server-url=localhost:1337
keycloak.realm=SARServices
keycloak.resource=sar-login
keycloak.public-client=false
keycloak.principal-attribute=preferred_username
keycloak.credentials.secret=NvkAdEPqbN39ubjqtrjn7dKElgLlUNLj
spring.security.oauth2.client.registration.keycloak.client-id=sar-login
spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.keycloak.scope=openid
spring.security.oauth2.client.provider.keycloak.issuer-uri=https://localhost:1337/realms/SARServices
spring.security.oauth2.client.provider.keycloak.user-name-attribute=preferred_username
Веб-конфигурация:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(jsr250Enabled = true)
class SecurityConfig(
private val keycloakLogoutHandler: KeycloakLogoutHandler
) {
@Bean
fun keycloakConfigResolver(): KeycloakConfigResolver? {
return KeycloakSpringBootConfigResolver()
}
@Bean
protected fun sessionAuthenticationStrategy(): SessionAuthenticationStrategy {
return RegisterSessionAuthenticationStrategy(SessionRegistryImpl())
}
@Bean
@Throws(Exception::class)
fun filterChain(http: HttpSecurity): SecurityFilterChain {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/user/*")
.hasRole("adventurer")
.anyRequest()
.permitAll()
http.oauth2Login()
.and()
.logout()
.addLogoutHandler(keycloakLogoutHandler)
.logoutSuccessUrl("/")
return http.build()
}
}
Лог сервера keycloak:
2023-01-07 18:46:55 2023-01-07 17:46:55,045 WARN [org.keycloak.events] (executor-thread-65) type=CODE_TO_TOKEN_ERROR, realmId=7eec0241-e69f-4d5c-8b7f-7a96926e8315, clientId=sar-login, userId=null, ipAddress=172.18.0.1, error=invalid_client_credentials, grant_type=authorization_code
докер сочиняет:
version: '1'
services:
postgresql:
image: docker.io/bitnami/postgresql:latest
environment:
- ALLOW_EMPTY_PASSWORD=yes
- POSTGRESQL_USERNAME=bn_keycloak
- POSTGRESQL_DATABASE=bitnami_keycloak
volumes:
- 'postgresql_data:/bitnami/postgresql'
- './certs:/etc/codelance/cert'
keycloak:
image: quay.io/keycloak/keycloak:latest
command: start --hostname-port=1337
ports:
- "1337:8443"
environment:
- KC_HOSTNAME=localhost
- KC_HTTPS_CERTIFICATE_FILE=/etc/codelance/cert/keycloakcert.pem
- KC_HTTPS_CERTIFICATE_KEY_FILE=/etc/codelance/cert/keycloak.pem
- KEYCLOAK_ADMIN=admin
- KEYCLOAK_ADMIN_PASSWORD=password
depends_on:
- postgresql
volumes:
- './certs:/etc/codelance/cert'
volumes:
postgresql_data:
driver: local
Вход в веб-ответ после входа:
присвоено значение false, ошибка 401 сохраняется
Измените keycloak.auth-server-url=localhost:1337, и если это не сработает, используйте host.docker.internal вместо localhost в keycloak.auth-server-url и spring.security.oauth2.client.provider. keycloak.issuer-uri
Ни то, ни другое не работает, обратите внимание, что в контейнере Docker работает только Keycloak. Я вижу события ошибок в контейнере (см. исходный вопрос).
Вы пытались сначала развернуть в KC на хост-компьютере, а затем, если это сработает, перенести в контейнер? Кстати, когда вы запускаете контейнер, вы публикуете порты -p?
Насчет портов я так думаю: см. добавленный докер композицию к вопросу ветки выше. Я никогда не запускал Keycloak на своей машине всегда в контейнере.
@dreamcrash может подтвердить, что такая же проблема возникает и с автономной версией.
Вам удалось решить эту?
@dreamcrash Да и нет, я следил за его ответом ch4mp, и было ясно, что я смешиваю концепции. Теперь я правильно использую сервер ресурсов.
Во-первых, адаптеры Keycloak для Spring устарели. Не используйте его.
Вы уверены, что вам нужен клиент, а не ресурс-сервер? Другими словами, возвращают ли методы вашего контроллера имена шаблонов или полезные данные JSON?
Мой ответ на этот другой вопрос содержит решение как для клиента, так и для сервера ресурсов: Используйте Keycloak Spring Adapter с Spring Boot 3
Сделайте keycloak.public-client=False вместо keycloak.public-client=True