我的目标
总体目标
我想为在同一服务器上托管的 Docker 容器上运行的各种应用程序提供服务,每个应用程序都位于 company.com
的子域上。我希望只有我的组织 (Microsoft AD azure) 中的人员才能访问子域,在某些情况下甚至只有拥有特定 AD 组的人员。
特定于 Keycloak 的目标
我只是想让特定的领域角色能够访问特定的子域,除此之外别无其他。并且仅使用单个领域客户端(请参阅进一步的解释)。
我已经取得的成就
我已经链接了服务器上的多个应用程序,并在特定子域上使用 traefik 为每个应用程序提供服务。例如 app1.company.com
和 app2.company.com
。
我还制作了一个中间件,以便所有使用它的路由器都确保用户必须登录。我使用了一个名为 oauth
的 thomseddon/traefik-forward-auth
容器。我正在使用 Keycloak,并且已成功链接 Azure Active Directory 作为身份提供商。为此,我启用了一个单租户应用程序并使用其客户端 ID 和 key 。我还成功地将一些 AD 组映射到 Keycloak 角色。
在 oauth
配置中,我从单个 keycloak 客户端而不是从 azure 应用程序添加了客户端 ID 和 key 。我相信如果我们想使用 traefik 来重定向流量,这是强制性的。
现在,只有我组织内部的人员才能访问每个应用。成功!
我使用的一些文档
我想做什么
每个应用程序都有自己的子域。但是,我无法弄清楚在哪里进行设置,以便仅当用户具有特定领域角色时才能访问某些子域(由于上述映射器,根据 AD 组自动链接)。
- 我考虑过在 Keycloak 客户端中添加资源,但我不知道如何使用子域来实现这一点。
- 另一种选择是为每个子域创建一个客户端,但这意味着我需要为每个子域运行一个
oauth
容器...这似乎有点矫枉过正,而且在不考虑维护的情况下浪费了资源。
最佳答案
我发现的唯一相对简单的解决方案是为我想要的每种权限规则类型(又名 Keycloak 中的角色)创建一个 Keycloak 客户端。
然后,对于每种类型,我必须创建一个 traefik-forward-auth
容器并将其连接到每个 Keycloak 客户端。我仍然使用相同的身份提供程序,因此一旦将其配置为生成角色,您只需告诉哪些角色可以使用哪个客户端。
举个例子,您希望有 3 种类型的权限规则:一种用于管理员,一种用于受信任的用户,一种用于不受信任的用户。它可能看起来像这样:
admin.example.com
trustedusers.example.com/app1
和trustedusers.example.com/app2
untrustedusers.example.com/app3
和untrustedusers.example.com/app4
然后,您将在 traefik 中拥有 3 个 forwardAuth
中间件。
这有点麻烦,但您的应用程序仍然使用单个 key 连接到您的 OIDC 提供商,然后您可以使用 keycloak 和这些客户端管理详细信息。
当然,仍然有像最初计划的那样每个应用程序有一个客户端的解决方案。如果您有大量应用程序(每个应用程序一个额外的容器+额外的中间件),这可能是不必要的,而且很麻烦。
关于azure - 使用 traefik 授予对特定子域的 Keycloak 角色访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72953386/