java - Spring key 斗篷 : Get User ID

标签 java spring spring-boot keycloak

我开发了一个 Spring Boot Web 服务并使用 Keycloak 进行访问管理。 该网站将一些用户数据存储在数据库中。我尝试将这些数据与登录的用户联系起来。

目前我将用户名与数据一起存储。但我喜欢存储用户 ID 而不是用户名。我怎样才能做到这一点?

我尝试通过这个获取 SecurityContext:

@Bean
@Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public KeycloakSecurityContext getKeycloakSecurityContext() {
    return ((KeycloakPrincipal<KeycloakSecurityContext>) getRequest().getUserPrincipal()).getKeycloakSecurityContext();
}

但是我得到一个错误:

There was an unexpected error (type=Internal Server Error, status=500).
Error creating bean with name 'scopedTarget.getKeycloakSecurityContext'
defined in com.SiteApplication: Bean instantiation via factory method
failed; nested exception is
org.springframework.beans.BeanInstantiationException: Failed to
instantiate [org.keycloak.KeycloakSecurityContext]: Factory method
'getKeycloakSecurityContext' threw exception; nested exception is
java.lang.ClassCastException:
org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken
cannot be cast to org.keycloak.KeycloakPrincipal

这是正确的方法吗?什么东西少了?

谢谢!

最佳答案

我找到了一个比上面简单得多的解决方案:

    @GetMapping
    public ResponseEntity getEndpoint(String someParam, HttpServletRequest request) {
        KeycloakAuthenticationToken principal = (KeycloakAuthenticationToken) request.getUserPrincipal();
        String userId = principal.getAccount().getKeycloakSecurityContext().getIdToken().getSubject();

        //....do something

        return new ResponseEntity(HttpStatus.OK);
    }

我认为你遇到的异常是因为你试图转换 getRequest().getUserPrincipal()KeycloakPrincipal<KeycloakSecurityContext>而它的类型是 KeycloakAuthenticationToken , 所以 ((KeycloakAuthenticationToken) getRequest().getUserPrincipal())会工作。

关于java - Spring key 斗篷 : Get User ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45802797/

相关文章:

java - Spring Integration DSL - Wiretap 不异步运行

java - 添加 @ComponentScan 从 jar 加载 bean 后,我的 Controller 未扫描,并且收到 404

spring - 配置文件特定属性与环境变量

java - Hibernate validator 验证不是 @NotEmpty 的空字段

java - MS ACCESS 完整性约束冲突 : NOT NULL check constraint;

java - 注入(inject)从 Java/Spring 中的某个方法返回的 String 属性

java - Spring Boot 和 Akka 集群 Actor 依赖注入(inject)不起作用

java - 使用 SOAP 连接到服务器时出错

java - 堆栈递归实现复杂度

java - 如何在 SpringBoot REST Api 中调用重写的handleMethodArgumentNotValid?