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

我的spring boot不能用KeyClope验证JWT令牌?

上官羽
2023-03-14

我有一个Spring-Boot-keydeport项目,我发现Spring-Boot不能用keydeport验证JWT。例如,如果我从keydepeat获得一个令牌并关闭keydepeat,我仍然可以使用这个JWT令牌访问我的endpoint。我有这个安全配置程序类:

@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);
    }

}

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

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

application.yml:

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

共有3个答案

西门京
2023-03-14

JWT旨在离线验证,这是通常会发生的事情。接收应用程序(JWT的消费者)不需要不断访问授权服务器即可验证JWT。即使Spring不能与您的Keycloak通信,但这并不意味着令牌没有经过验证。正如其他人指出的那样,Spring缓存用于验证JWT签名的密钥,如果可以,它将使用缓存。

如果出于某种原因,您希望您的服务/API在线验证JWT(可能是因为您想实现撤销令牌的机制),您可以切换到使用令牌内省的不透明令牌。在每次请求时,您的服务都必须调用Keycloak将不透明令牌交换为JWT。请注意,此解决方案将使用更多资源,并且只有在您有充分理由的情况下才应该使用它。

乐山
2023-03-14

JWT令牌已缓存在您的springboot应用程序中,这是默认缓存存储。为了从您的springboot应用程序中删除此令牌,请使用一些自定义缓存,例如在您的应用程序中配置的redis缓存,而不是默认缓存。没有可能删除存储在默认缓存中的令牌。只有在令牌中设置的超时后,令牌才会自动失效

经俊茂
2023-03-14

您可以查看JwtDecoders的实现。

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

 类似资料:
  • 我从KeyCloak获得签名的JWT令牌: 因此,访问令牌是: 我查询keydove的: 因此,公钥是: 现在,我尝试按如下方式进行脱机验证: 但我得到一个无效的密钥例外: 我需要公钥对象来验证访问令牌,如下所示: 怎么了?我看到了很多这段代码的例子,所以我怀疑问题出在密钥本身。

  • 我正在使用SpringBoot开发具有微服务架构的Rest Backend。为了保护endpoint,我使用了JWT令牌机制。我正在使用Zuul API网关。 如果请求需要权限(来自JWT的角色),它将被转发到正确的微服务。Zuul api网关的“WebSecurityConfigrerAdapter”如下。 这样,我必须在这个类中编写每个请求授权部分。因此,我希望使用方法级安全性,即“Enabl

  • 有人在springboot应用程序中找到了这样的工作示例吗? /auth控制器,用户在其中提供ActiveDirectory凭据(通过基本身份验证或POST json)并在提供有效AD凭据的情况下接收JWT令牌。不应涉及LDIF文件,Springboot应用程序将根据ldaps://ActiveDirectoryhost: 636endpoint验证凭据 /myapi控制器仅在步骤1(上图)中的有

  • 我目前正在使用Vapor开发Swift后端。我的iOS客户端使用新的iOS 13功能“使用Apple登录”。当用户登录时,我会得到一个身份令牌(访问令牌),这是一个由Apple签名的有效JWT令牌。这将在所有正在进行的通信中发送到服务器,以验证服务器提供的某些路由。 在服务器上,我想通过验证令牌签名来验证发送的令牌是否确实由Apple签名,并且不是由某些恶意用户专门创建的。Apple提供了一个HT

  • 我正在使用带有JWT的Spring Security来验证rest api。登录时,会生成JWT令牌并共享给移动客户端。但是,后续请求中的令牌没有经过验证。安全配置有什么问题吗? Spring Security版本-5.1.6。释放 //安全配置 //JWT Token Auth Filter——永远不会调用它 我希望登录后的所有请求都将根据JWT令牌进行身份验证。我尝试将要验证的服务的名称输入如

  • 我正在制作一个javascript客户端,它使用JWT令牌连接到Api。在服务器端没有问题,我可以创建令牌对其进行签名,然后验证签名,从而确保没有人篡改令牌。 但我如何在客户端做到这一点。我可以解码JWT令牌并查看头、负载和签名。但是如何在客户端验证签名?是否有用于此的库,如何将公钥传输到客户端? 如果我不验证签名,我怎么知道令牌没有被篡改?