spring-security Spring Security:从SecurityContextHolder中的jwt提取主题

8yoxcaq7  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(176)

我想从校长那里得到实验对象。
目前,我使用的是以下代码:

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

if (principal instanceof UserDetails) {
    String username = ((UserDetails)principal).getUsername();
} else {
    String username = principal.toString();
}

实际上,principal对象类是org.springframework.security.oauth2.jwt.Jwt
尽管如此,我希望得到的主题是jwt,而不是我得到的整个令牌。
我目前的配置运行良好,我的意思是,我可以使用@PreAuthorize注解来授权方法。
我的当前配置是:

@Bean
public SecurityFilterChain securityFilterChain(
    HttpSecurity http
) throws Exception {
    Customizer<OAuth2ResourceServerConfigurer<HttpSecurity>> oauth2Customizer = (config) -> config.jwt();
    return http
        .httpBasic().disable()
        .csrf().disable()
        .formLogin().disable()
        .anonymous().disable()
        .logout().disable()
        .authorizeHttpRequests((authorize) -> authorize
            .antMatchers("/actuator/**").permitAll()
            .antMatchers("/gicar/**").permitAll()
            .anyRequest().authenticated()
        )
        .oauth2ResourceServer(oauth2Customizer)
        .build();
}

有什么想法吗?

mf98qq94

mf98qq941#

假设没有其他自定义配置,并且您的令牌是JwtAuthenticationToken的示例,则可以直接从令牌本身提取主题。

String subject = SecurityContextHolder.getContext().getAuthentication().getName();

根据JwtAuthenticationToken和JwtAuthenticationConverter的

相关问题