首页 > 解决方案 > 我将如何隔离客户端访问,keycloak 配置

问题描述

如果我有多个客户端,我将如何隔离客户端访问。我想要实现的是颁发的访问令牌应该只对预期的服务有效。例子。如果我有两个客户端 client1 和 client2,则颁发给 client1 的令牌应该无法访问来自 client2 的资源,目前我的设置允许这两个客户端访问类型都设置为机密。并且 JWT 令牌确实包含 client_id(即“aud”) 字段,但这不会在身份验证阶段进行评估。

标签: spring-bootkeycloak

解决方案


有多种方法可以实现。我将使用的方法是在每个客户端中定义一个角色,用户必须访问该客户端。然后,您将在允许访问该客户端之前检查他们是否具有该客户端角色。

要创建客户端角色,请在管理控制台中选择您的“领域”,然后从左侧菜单中选择“客户端”=> 选择“client2”=> 选择“角色”=>“添加角色”,然后将其命名为你要。说“管理员”。

要将该角色授予用户以便他们可以访问该客户端,请转到“用户”=> 选择您的用户 => 角色映射 => 在客户端角色部分下选择您的客户端 => 选择您的新角色并将其分配给用户.

然后,您需要通过“客户端”=>“客户端 1”=>“范围选项卡”=> 取消选中“允许的完整范围”=> 从“客户端角色”下拉列表中选择“客户端 2”来限制客户端 1 的范围访问,并确保该角色未应用于此客户端。

您现在可以通过转到“客户端”=>“客户端 1”=>“客户端范围”=>“评估选项卡”来测试该用户是否可以通过登录“客户端 1”来访问此角色。如果客户端范围配置正确,您不应获得对客户端 2 角色的访问权限。

难题的最后一块是配置您的客户端以检查此角色。在您的后端 API(或其他客户端强制执行位置)上,配置 keycloak 以防止为该客户端新创建的客户端角色。例如,如果您的 API 是用 Node 编写的,您将使用 Keycloak Node 适配器,将其设置为“Client 2” app.get( '/special', keycloak.protect('admin'), specialHandler );

可以在此处找到有关使用适配器进行保护的更多信息:https ://www.keycloak.org/docs/latest/securing_apps/#_nodejs_adapter


推荐阅读