我正在开发一个微服务体系结构,其中我使用了以下组件:
- 作为API网关的KongHQ
- Keycloft作为IAM解决方案
- 用Spring Boot编写的微服务
我的基本要求是将身份验证/授权与Spring引导微服务完全解耦。因此,API的认证和授权应在API网关层进行。大多数文章和教程都建议将Key斗篷与Spring Boot集成在一起。我真的很想知道这个要求是否可行,如果可行,如何做到?
我不会将安全性与微服务分离,原因有两个:
- 访问控制是我想要进行单元测试的业务需求
- spring-security可能比任何API网关安全过滤器都更强大(可表达、可测试等(
您不必将Key斗篷与spring-boot集成(实际上您不应该这样做,因为用于spring的Key斗篷库已被弃用(。
Spring security有用于资源服务器的工具。在这里取样。
我还在spring-boot-starter-oauth2-resource-server
之上编写了(非常(薄层,以简化资源服务器配置。大多数配置选项都可以从属性中获得,这些属性在微服务中保存了相当多的Java代码。在那里取样。
按照高级教程,您甚至可以构建一个像@PreAuthorize("is(#username) or isNice() or onBehalfOf(#username).can('greet')")
一样富有表现力的安全DSL。祝你好运,用API getway实现同样的目标。
上面链接的repo还包含一些用于配置单元测试安全上下文的注释:
@Test
@ProxiesAuth(
authorities = { "AUTHOR" },
claims = @OpenIdClaims(preferredUsername = "Tonton Pirate"))
void whenHimselfThenCanGreetFor() throws Exception {
mockMvc.get("/greet/on-behalf-of/Tonton Pirate").andExpect(status().isOk()).andExpect(content().string("Hi Tonton Pirate from Tonton Pirate!"));
}
下面是一篇非常详细的文章,介绍API网关和密钥斗篷的使用:https://apisix.apache.org/blog/2022/07/06/use-keycloak-with-api-gateway-to-secure-apis/