当前位置: 首页 > 知识库问答 >
问题:

NullPointer试图在Spring Boot中使用KeyClope获取用户信息

端木震博
2023-03-14

我在REST应用程序中使用Keycloak,带有spring-boot。它工作正常,我在Keycloak中定义了角色,然后在我的Config.class我允许根据每个用户的角色访问我感兴趣的endpoint。我在尝试检索我后面的用户信息时遇到问题(姓名、委托人、权限...)。

我读过很多这样的帖子:

如何从钥匙中获取主体斗篷-安全-Spring-引导-应用程序

空指针-当-固定-Spring-引导-Rest-服务-带-键斗篷

但我找不到适合我的。如果使用SecurityContext或keydovearthenticationtoken,调用getAuthentication方法时会得到null。

在我的代码中,在控制器类中,我有以下内容:

private SecurityContext securityContext = SecurityContextHolder.getContext();
    
    @GetMapping(value = "/getLicenses")
    public ResponseEntity<List<License>> getLicenses() {
        System.out.println("SecurityContext: " + securityContext);
        System.out.println("Authentication securityContext: " + securityContext.getAuthentication());
        return new ResponseEntity<List<License>>(licenseService.getLicenses(), null, HttpStatus.OK);
    }

访问/获取许可证后,控制台的输出为:

SecurityContext: org.springframework.security.core.context.SecurityContextImpl@ffffffff: Null authentication
Authentication securityContext: null

我的KeyCloveSecurityConfig。班

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity( prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class KeycloakSecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
    
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.csrf().disable();
        http.authorizeRequests()
                .antMatchers("/getLicenses").hasAnyRole("GUEST", "ADMIN", "SUPERADMIN")
                .antMatchers("/getRevision/{id}").hasRole("SUPERADMIN")
                .permitAll();
    }
    
    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }

它工作得很好,如果我尝试使用“GUEST”角色用户访问/getRevision/{id}endpoint,它将不允许这样做。

我的yml具有BD连接、JPA和Keyclope连接:

keycloak.auth-server-url : XXXX
keycloak.realm: XXXX
keycloak.resource: login
keycloak.public-client: true

Keyclope有3个用户,有3个不同的角色(每个用户1个rol)。我可以用邮递员登录

有人知道我在尝试访问SecurityContext时为什么会为null吗?我的目标是检索用户数据

共有1个答案

郑哲彦
2023-03-14

首次创建控制器时,您正在初始化控制器中的securityContext对象:

private SecurityContext securityContext = SecurityContextHolder.getContext();

此时,没有可用的安全上下文,这意味着上下文始终为空。

不要在控制器中使用私有变量来存储上下文,而是从getLicens方法中的SecurityContextHolder中获取它:

@GetMapping(value = "/getLicenses")
public ResponseEntity<List<License>> getLicenses() {
    SecurityContext securityContext = SecurityContextHolder.getContext();
    System.out.println("SecurityContext: " + securityContext);
    System.out.println("Authentication securityContext: " + securityContext.getAuthentication());
    return new ResponseEntity<List<License>>(licenseService.getLicenses(), null, HttpStatus.OK);
}
 类似资料:
  • 本文向大家介绍SpringBoot中获取微信用户信息的方法,包括了SpringBoot中获取微信用户信息的方法的使用技巧和注意事项,需要的朋友参考一下 前言 不知道你是否参加过拼多多上邀请微信好友砍价功能,这个功能实现首先需要考虑的就是获取微信用户的信息。获取用户信息就是获取公众号下微信用户的信息,今天我就来讲讲如何从公众号下获取微信用户信息。 需要声明一点的是获取微信公众号下的用户信息的权限是服

  • 嗨,我尝试用InMemoryDao获取userDetailsService。但是我得不到,我试过@Autowired,@ Inject(userdailsservice,InMemoryDaoImpl,InMemoryManager...)但是我不能让它工作。 有公共类安全扩展WebSecurityC 只尝试了WebSecurityCon

  • 我在我的nodejs应用程序中为注册用户在keybeat上实现了keybeat,我使用的登录API是: 如果用户名和密码正确,则返回登录用户的令牌, 现在我需要传递这个令牌(通过上面的API返回),并检查这个令牌是否正确,如果令牌正确,我需要用户详细信息,是否有用于此的API。 提前谢谢

  • 我正在使用keycloak来保护我的servlet。我必须添加新角色并动态地将它们分配给用户。它使用管理应用编程接口在keycloak中工作,但是我不知道如何在servlet中获得特定用户的角色。 我尝试了这个解决方案,但我得到了空集:

  • 问题内容: 所以我的Android Gallery中有3个文件夹。我正在尝试将这些文件夹的文件读入File数组,然后从那里将图像源转换为real 。 我的问题是引用文件数组时遇到问题。这是一些代码: 使用这些图像文件数组… 我的CreateList方法。错误是当我引用list.length时。 就像我说的那样,错误是当我使用list.length引用一个File数组时,例如我在第一个代码段中创建的

  • 通过该接口可以获取指定用户的账户信息,地址为: http://spark.bokecc.com/api/user 需要传递以下参数: 参数 说明 userid 用户id,不可为空 format 返回格式,xml 或json 返回数据user包含如下字段: 字段名 说明 account 用户账户 version 版本信息 expired 到期时间 space 用户空间信息 traffic 用户流量信