我正在构建由 Keycloak 保护的微服务应用程序,并希望保护每个微服务。这里已经写了很多次了,每次您想要验证令牌时都查询 Auth 服务(Keycloak - 在我的例子中)并不是一个好主意。因此,一旦您的请求通过 API 网关传递到微服务,最好在本地验证签名。
所以,我想以这种方式设置我的 Spring 应用程序。
我说得对吗:
jwt.jwk-set-uri
参数负责本地检查JWT密钥。因此,当我进行设置时,将从 Keycloak 的端点获取打开密钥,以便将来离线检查 JWT 签名的有效性。每次检查时无需访问 Keycloak 的服务器。issuer-uri
而没有 jwk-set-uri
,则每个请求只会进行在线 JWT 检查。如果以上均不正确,请描述您认为正确的方式。 不幸的是,Spring 的文档对此并没有那么详细,指出:
因此,资源服务器在启动时不会 ping 授权服务器。我们仍然指定颁发者 uri,以便资源服务器仍然验证传入 JWT 上的 iss 声明。
我正在谈论的配置在这里(application.yaml):
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://localhost:3000/realms/msapp
jwk-set-uri: ${spring.security.oauth2.resourceserver.jwt.issuer-uri}/protocol/openid-connect/certs
安全配置
@EnableWebFluxSecurity
@EnableReactiveMethodSecurity()
public class SecurityConfig {
@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
http
.csrf().disable()
.authorizeExchange()
.pathMatchers("/login").permitAll()
.anyExchange()
.authenticated().and()
.oauth2ResourceServer()
.jwt()
.jwtAuthenticationConverter(keykloakJwtAuthConverter());
return http.build();
}
根据文档:资源服务器:
资源服务器将使用此属性(
issuer-uri:
)进一步自我配置,发现授权服务器的公钥,并随后验证传入的 JWT。
如果资源服务器必须能够独立于授权服务器启动,则可以提供
jwk-set-uri
。
我认为我已经回答了您的问题以了解更多详细信息,请阅读您自己的有关上面提供的资源服务器的文档,其中有一个很好的示例解释。