java - 我的 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
解决方案
你可以看看JwtDecoders.fromOidcIssuerLocation(issuerUri)
.
正在发生的事情是在您的应用程序启动时获取密钥,并且应用程序缓存它们以便在之后执行验证。考虑到这一点,即使您关闭 Keycloak,JWT 仍将被验证,因为密钥仍被缓存。
推荐阅读
- javascript - 如果单击 forEach 循环中的下一个 div,如何关闭上一个打开的 div?
- kubernetes - 如何在 datadog 中查询 EKS 版本?
- nginx - 带有 Docker 桌面的 Windows 上的 Kubernetes Nginx 入口控制器 - 似乎不起作用
- firebase - Google Auth idtoken 返回连接到 Firebase 的 null
- java - 在 Spring Boot 集成测试中模拟外部依赖项
- xslt - ANT:在使用 Saxon 的 XSLT 任务中找不到 XML 解析器
- excel - VBA 表格范围 - 函数不包括表格的最后一行
- django-forms - 在 Django Signals 中使用额外的表单字段
- tensorflow - 如何在 keras 网络中手动设置参数,比 model.set_weight() 更有效?
- python - 当单击带有 pysimpleGUI 的按钮并在多行中显示输出时,如何解决卡住的问题?