使用keycloak限制单个领域中的客户端访问

时间:2018-06-21 07:27:16

标签: keycloak

我有一个包含3个单页应用程序和一个共享后端的单一领域。我想限制对其中一个SPA的访问,以使没有特定角色的用户无法登录。

但是,一旦您在领域中创建了一个用户,该用户便可以登录到每个SPA客户端。我可以限制后端的端点,但是我不想以编程方式拒绝特定SPA中的用户,而是自动在登录页面上。

在这种情况下,我尝试使用似乎没有作用的客户端角色。到目前为止,我发现的唯一解决方案是创建单独的领域,我认为从概念上讲这是正确的方法,但不幸地提出了一些实际问题,例如一个域的管理员必须能够管理(CRUD)另一个域的用户,这似乎很不直观。

2 个答案:

答案 0 :(得分:4)

users without a specific role can't log in - 这不是很好的要求。系统如何知道用户是否具有特定角色而无需登录(身份验证)? Keycloak 提供 Open ID Connect SSO 协议,指定用于身份验证。 OIDC 认证成功后生成令牌,其中可能还包含用户角色。所以只有这样才能应用授权。因此,让我们将需求更改为:users without a specific role can't access SPA,这更符合 OIDC 的概念。

成熟的 OIDC SPA 库提供 authorization guard(名称可以不同,它是某种登录后功能),可以在其中实现授权。授权通常需要在令牌中具有特定角色,否则用户将被重定向到自定义路由,例如/unauthorized。这是页面,您可以在其中说明拒绝访问的原因。常见用例也是基于用户角色定制应用程序。例如,具有管理员角色的用户将在菜单中看到比标准用户更多的项目——这也是一种授权。带有授权保护的 SPA 库的随机示例(我不是说这是最好的实现) - https://github.com/damienbod/angular-auth-oidc-client/issues/441

请记住,SPA 并不“安全” - 用户可能会篡改浏览器中的代码/数据,因此理论上用户可以跳过浏览器中的任何授权。他可能会访问 SPA,因此在后端 (API) 端获得适当的授权也很重要。攻击者可能有权访问 SPA,但如果 API 拒绝他的请求,它将毫无用处。

顺便说一句:您可以在互联网上找到有关如何使用自定义脚本(例如,将测试角色存在的自定义脚本映射器)向 Keycloak 客户端添加授权的黑客建议。这是一种糟糕的架构方法——它在身份验证过程中解决授权问题。用户无法登录的原因尚不清楚 - 如果是因为凭据错误或因为在身份验证过程中需要某些角色。

答案 1 :(得分:0)

我能够使用以下方法限制用户访问应用程序:

  1. 我已经在我的默认领域(主)中为客户端创建了我的客户端 test_client1 和 test_client2 它们都是 OIDC 客户端,可以通过秘密进行机密访问
  2. 我为他们每个人都创建了一个角色,即我有 test_client1_login_role 的角色 test_client1 和 test_client2_login_role 的 test_client2。 enter image description here
  3. 我创建了两个用户 - user1 和 user2,并将它们分配给客户端 1 和客户端 2 角色。但是要限制对 client1 的访问,我必须删除默认角色: enter image description here
  4. 成功了,当我使用 user2 登录时,我看到 test_client2 而不是 test_client1 作为可用应用程序: enter image description here 但是我没有从 user1 中删除角色,因此当我使用 user1 登录时,我可以看到两个客户端: enter image description here

因此,您应该为您的应用程序使用不同的客户端,为每个客户端分配特定角色并从用户中删除默认角色并添加一个与特定应用程序相关的角色。