【发布时间】:2021-12-30 09:26:22
【问题描述】:
我正在尝试将我的 Spring Boot 应用程序配置为使用 Keycloak 作为 SSO。
我正在关注本主题的标准教程:
先添加依赖
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-starter</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.keycloak.bom</groupId>
<artifactId>keycloak-adapter-bom</artifactId>
<version>13.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
二、填充属性
# Keycloak
keycloak.realm = Mixeway
keycloak.auth-server-url = http://localhost:8180/auth
keycloak.ssl-required = external
keycloak.resource = MixewayApp
keycloak.credentials.secret = secret
keycloak.use-resource-role-mappings = false
keycloak.bearer-only = false
keycloak.security-constraints[0].authRoles[0]=USER
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/v2/auth/keycloak
第三个创建控制器来处理身份验证
@GetMapping(value = "/v2/auth/keycloak")
public void authUsingKeycloak(Principal principal){
log.info("user {} logged using keycloak", principal.getName());
}
身份验证正常工作。我可以看到日志:
2021-12-30 10:18:48.213 DEBUG 6947 --- [nio-8443-exec-3] o.k.adapters.OAuthRequestAuthenticator : Verifying tokens
2021-12-30 10:18:48.265 DEBUG 6947 --- [nio-8443-exec-3] o.k.a.rotation.JWKPublicKeyLocator : Realm public keys successfully retrieved for client MixewayApp. New kids: [mpkD1RwCaaIbp8tN-a9__hlc03UpxrQ8SE5atlDrF78]
2021-12-30 10:18:48.270 DEBUG 6947 --- [nio-8443-exec-3] o.k.adapters.OAuthRequestAuthenticator : Token Verification succeeded!
2021-12-30 10:18:48.277 DEBUG 6947 --- [nio-8443-exec-3] o.k.a.rotation.JWKPublicKeyLocator : Realm public keys successfully retrieved for client MixewayApp. New kids: [mpkD1RwCaaIbp8tN-a9__hlc03UpxrQ8SE5atlDrF78]
2021-12-30 10:18:48.277 DEBUG 6947 --- [nio-8443-exec-3] o.k.adapters.OAuthRequestAuthenticator : successful authenticated
2021-12-30 10:18:48.283 DEBUG 6947 --- [nio-8443-exec-3] o.k.adapters.RequestAuthenticator : User '343050ef-bc48-48ae-af93-5dd3f0830956' invoking 'https://localhost:8443/v2/auth/keycloak?state=d1ebaf04-c0fd-4415-8f70-56b68e9f8485&session_state=e2e280a0-428d-4481-99c6-f45cfa171f4c&code=da46d2ee-14b5-45ef-a15f-6a69e196f092.e2e280a0-428d-4481-99c6-f45cfa171f4c.0b00edfd-1474-42ec-a2df-f2754b830dc6' on client 'MixewayApp'
2021-12-30 10:18:48.283 DEBUG 6947 --- [nio-8443-exec-3] o.k.adapters.RequestAuthenticator : AUTHENTICATED
2021-12-30 10:18:48.291 DEBUG 6947 --- [nio-8443-exec-4] o.k.adapters.PreAuthActionsHandler : adminRequest https://localhost:8443/v2/auth/keycloak
2021-12-30 10:18:48.291 DEBUG 6947 --- [nio-8443-exec-4] o.k.adapters.RequestAuthenticator : AUTHENTICATED: was cached
2021-12-30 10:18:48.291 DEBUG 6947 --- [nio-8443-exec-4] .k.a.t.AbstractAuthenticatedActionsValve : AuthenticatedActionsValve.invoke /v2/auth/keycloak
但是,由于 null Principal 对象,我得到了 NullPointer 异常。谁能给我一个提示,如何在 spring 中配置 keycloak auth 以便正确设置主体对象?
编辑
重写控制器后
@GetMapping(value = "/v2/auth/keycloak")
public void authUsingKeycloakGet(HttpServletRequest request){
KeycloakPrincipal principal=(KeycloakPrincipal) request.getUserPrincipal();
KeycloakSecurityContext session = principal.getKeycloakSecurityContext();
AccessToken accessToken = session.getToken();
}
和调试应用程序我可以在HttpServletRequest 中看到主体,但主体和request.getUserPrincipal() 仍然为空:
【问题讨论】:
标签: java spring spring-boot keycloak