Spring Security 有没有办法缓存令牌内省结果?

Rom*_*ert 3 spring-security-oauth2 keycloak

我有一个 Spring boot REST API,由 Keycloak 和 Spring Security 保护。

我找不到是否有一种方法可以防止每个请求进行令牌内省(即短期缓存内省结果)。每次我访问 API 时,都会在 Keycloak 上检查令牌,这对性能来说并不是很好:(

感谢您的任何建议。

jzh*_*aux 7

这是您在使用不透明令牌(需要内省)时所做的权衡。

使用不透明令牌:

  • OAuth 2.0 客户端看不到内容
  • 授权服务器可以随时撤销令牌

权衡是您需要在每个请求上检查授权服务器以确保令牌没有失效。

使用智威汤逊:

  • OAuth 2.0 客户端可以检查令牌的内容
  • JWT 带有自己的过期信息

JWT 的性能优势所换取的是它不能失效,只能过期。

所以,这并不是你的问题,而是你问的是性能,而 JWT 是解决不透明令牌性能影响的一种非常常见的方法。

您可能还会问自己,是否需要为应用程序中的每个路径提供不透明令牌的额外安全优势。您可以对某些路径使用 JWT 并检查授权服务器是否有更高安全性的路径?

不管怎样,你问的是缓存。是的,Spring Boot 会为您发布一个实例OpaqueTokenIntrospector,您可以使用缓存的实例覆盖该实例:

@Component
public class CachingOpaqueTokenIntrospector
        implements OpaqueTokenIntrospector {

    private final NimbusOpaqueTokenIntrospector introspector = 
        // ... construct

    @Override
    public OAuth2AuthenticatedPrincipal introspect(String token) {
        // call delegate introspector and cache        
    }
}
Run Code Online (Sandbox Code Playgroud)

例如,您可以在方法@Cacheable上使用注释。introspect