首页 > 解决方案 > Spring Boot 2 和 Keycloak 授权:实现一个简单的 REST API

问题描述

我使用 Spring Boot 2 和 Keycloak (keycloak-spring-boot-starter) 来实现 REST API。但是,我就是做错了。

我的 API 资源如下所示:

POST /api/a 创建一个,如果授予 a:write

GET /api/a 读取所有授予 a:read

GET /api/a/{name} 读取单个 a(如果授予 a:read)

POST /api/a/{name}/b 在 a 下创建 b,如果授予 b:write 等等...

每个 API 资源还应该在 Keycloak 中获得一个 ResourceRepresentation,因为要求是向用户授予基于每个资源的读取访问权限。我计划为此使用组并将用户分配到与资源名称匹配的组。(例如资源名称将是 /a1/b1,这也是我分配具有读取访问权限的用户的组)

写入权限将仅授予管理员,管理员将在相应分配角​​色的组中。

我一直在尝试整个星期,但没有成功。我的 API 实现和 Keycloak 配置看起来都像战场。github 上的示例过于简单,因为它没有显示嵌套资源以及 HTTP 方法和范围之间的相关性。

你将如何构建

  1. 您的 Keycloak 服务器(即客户端配置:资源(包括 URI)、范围、策略、权限;以及:组、角色)?
  2. 您的 Spring Boot 2 application.properties(与 Keycloak Authz 一起使用)?
  3. 以下陈述是否正确:如果我的 API 设置正确(将路径和方法映射到范围),我可以通过 Keycloak 用户、组、角色、策略和权限完全控制对我的资源的访问。
  4. policy-enforcer-config 可以混合使用吗?意味着一部分来自 application.properties,另一部分来自 Keycloak 服务器?它会合并所有可能的路径吗?路径将如何解决?

标签: spring-bootauthorizationkeycloak

解决方案


从概念上讲,我必须区分单一资源和列表资源:

/buildings/building-1              associated with scopes building:read, building:write, roomS:read, roomS:write
/buildings/building-1/rooms        requires the roomS:read or roomS:write respectively
/buildings/building-1/rooms/room-1 associated with scopes room:read, room:write

/rooms请注意资源范围中的复数形式。

此外,application.properties 和 Keycloak 服务器之间的混合策略执行器配置工作:端点映射到 application.properties 中的范围,具体资源路径由 Keycloak 服务器管理。

希望这对其他人有帮助!


推荐阅读