首页 > 解决方案 > 我的 Spring Boot 不使用 Keycloak 验证 JWT 令牌?

问题描述

我有一个 Spring Boot + Keycloak 项目,我发现 Spring Boot 没有使用 keycloak 验证 JWT。例如,如果我从 Keycloak 获得令牌并关闭 Keycloak,我仍然可以使用此 JWT 令牌访问我的端点。我有这个安全配置器类:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
@RequiredArgsConstructor
public class KeycloakSecurityConfigurer extends WebSecurityConfigurerAdapter {

    private final RoleConverter converter;

    @Value("${spring.security.oauth2.keycloak.jwt.issuer-uri}")
    private String issuerUri;

    @Override
    public void configure(final HttpSecurity http) throws Exception {
        http.headers().frameOptions().disable()
            .and()
        .csrf().disable()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        .oauth2ResourceServer(
                oauth2ResourceServer -> oauth2ResourceServer.jwt(
                        jwt -> jwt.jwtAuthenticationConverter(jwtAuthenticationConverter())));
        
        http.authorizeRequests().antMatchers("/**").authenticated();
    }

    private Converter<Jwt, ? extends AbstractAuthenticationToken> jwtAuthenticationConverter() {
        JwtAuthenticationConverter jwtConverter = new JwtAuthenticationConverter();
        jwtConverter.setJwtGrantedAuthoritiesConverter(converter);
        return jwtConverter;
    }

    @Bean
    public JwtDecoder jwtDecoder() {
        return JwtDecoders.fromOidcIssuerLocation(issuerUri);
    }

}

“转换器”没什么特别的,只是从 JWT 令牌中提取角色并返回它们的列表。

如何强制 Spring Security 验证 JWT 令牌?

应用程序.yml:

spring:
   security:
      oauth2:
         keycloak:
            jwt:
               issuer-uri: http://localhost:8180/auth/realms/test-realm

标签: javaspringspring-bootspring-securityjwt

解决方案


你可以看看JwtDecoders.fromOidcIssuerLocation(issuerUri).

正在发生的事情是在您的应用程序启动时获取密钥,并且应用程序缓存它们以便在之后执行验证。考虑到这一点,即使您关闭 Keycloak,JWT 仍将被验证,因为密钥仍被缓存。


推荐阅读