应用程序通常包含仅供某些用户使用的资源。例如,管理用户管理其员工的信息,而销售用户管理其客户的信息。这需要通过权限控制访问的封闭区域。在本文中,我想通过几个简短的示例向您展示如何在 Keycloak 中管理这些访问权限并分配这些用户组。
Keycloak 是一个基于 Java 的开源身份和访问管理 (IAM) 解决方案。 IAM 系统通过执行两项任务提供管理各种应用程序的身份和访问权限的能力:
身份验证:通过例如提供用户名和密码来验证用户的身份。
授权:成功证明身份后,用户将被授予访问其资源的权限。
我将在本文后面更详细地讨论授权。 Keycloak 是经过认证的 OpenID Connect 协议实现,也是一个既定的标准解决方案,可提供许多开箱即用的功能。其中包括单点登录、身份代理和第三方系统(例如 Google、Twitter)集成。
基本术语
Keycloak 基于术语“领域”、“客户端”和“角色”。每个领域管理多个用户,并且通常包含多个客户端。应用程序或后端服务可以使用这些来对领域的用户进行身份验证。在我们的示例中,我创建了一个名为“my-application”的领域以及客户端“my-application-webapp”和“my-application-api”(参见图 1)。例如,my-application-webapp 客户端可以由前 高中生邮寄名单 端使用,my-application-api 客户端可以由后端服务使用。
图 1:所创建领域中的客户端概览。我创建了客户端“my-application-api”和“my-application-webapp”。其余客户端默认可用。
图 1:所创建领域中的客户端概览。我创建了客户端“my-application-api”和“my-application-webapp”。其余客户端默认可用。
角色
您现在可以通过角色控制授权。这些可以分配给用户的类型或类别(例如销售员工)。角色基本上分为三种类型:
1. 领域角色:全局角色,在每个客户端中都可用,并且可以分配给每个用户。
2. 客户端角色:仅在特定客户端中可用且无法从其他客户端访问的角色。
3. 复合角色:一个或多个其他角色链接到一个复合角色。用户始终具有为其分配的复合角色的链接角色。
领域角色是一般权限,而客户端角色是更细粒度的权限,仅供各个客户端使用。图 2 显示了可能的领域角色的示例性概述。
图 2:领域角色概述。默认情况下存在“offline_access”和“uma_authorization”角色。
图 2:领域角色概述。默认情况下存在“offline_access”和“uma_authorization”角色。
通过角色保护资源
您现在可以直接使用定义的角色来保护您的前端和后端服务。基于HTML5/Javascript的应用程序可以通过Javascript适配器轻松集成Keycloak的功能。借助它的帮助,您可以显示应用程序的各个区域,例如使用以下方法使用条件渲染:
在 Java 中保护 bean 类和方法的安全也同样容易。可以通过注释限制或允许访问:
通过群组有效管理角色
通常可以定义具有多个访问权限的用户组,例如根据公司的结构。您可以在 Keycloak 中将它们创建为组并为其分配角色。然后,您可以将用户分配到任意数量的组。这样做的好处是您不必将角色单独分配给用户,从而节省大量维护工作(尽管也可以将角色单独分配给用户)。图 3 显示了“经理”组的角色概述示例。
图 3:分配了角色的“经理”组
图 3:分配有“管理员”角色的“经理”组。由于“管理员”是分配了“职员”角色的复合角色,因此可以在“有效角色”下看到这两个角色。
组中的用户自动拥有所有分配的角色,从而可以访问相应的资源。组是分层的,因此可以在任何粒度级别管理权限。
在我们的示例中,我现在想定义来自不同公司的用户。为此,我为每家公司创建了一个组。公司内部有不同领域的员工。公司“Company_1”雇用经理和开发人员,公司“Company_2”还雇用销售员工。来自北美地区的开发者还将获得额外的访问权限。这会产生如图 4 所示的组层次结构。可以为这些组分配任何角色,以实现细粒度的访问授权。