第 9 章 策略 enforcers
策略强制点(PEP)是一种设计模式,因此您可以使用不同的方法实施它。Red Hat Single Sign-On 提供了为不同平台、环境和编程语言实施 PEP 所需的所有方法。红帽单点登录授权服务提供了 RESTful API,利用 OAuth2 授权功能使用集中授权服务器进行精细的授权。
PEP 负责评估与受保护资源关联的策略,从红帽单点登录服务器实施这些决策。它充当应用程序中的过滤器或拦截器,以便根据这些决策所授予的权限,检查对受保护资源的特定请求。
根据您使用的协议强制实施权限。使用 UMA 时,策略强制器始终需要一个 RPT 作为 bearer 令牌来确定是否可以提供请求。这意味着,客户端应首先从 Red Hat Single Sign-On 获取 RPT,然后向资源服务器发送请求。
但是,如果您不使用 UMA,您也可以将常规访问令牌发送到资源服务器。在这种情况下,策略 enforcer 将试图直接从服务器获得权限。
如果您使用任何 Red Hat Single Sign-On OIDC 适配器,可以通过在 keycloak.json 文件中添加以下属性来轻松启用策略 enforcer:
keycloak.json
{ "policy-enforcer": {} }
当您启用策略强制时,会将发送的所有请求拦截,并根据 Red Hat Single Sign-On 向身份发出的身份授予受保护资源对保护资源的访问。
策略强制使用 Red Hat Single Sign-On 管理控制台与应用程序的路径和您为资源服务器创建的资源相关联。默认情况下,当您创建资源服务器时,Red Hat Single Sign-On 会为资源服务器创建一个 默认配置,以便您可以快速启用策略强制。
9.1. Configuration
要为应用程序启用策略强制,请在 keycloak.json 文件中添加以下属性:
keycloak.json
{ "policy-enforcer": {} }
如果要手动定义受保护的资源,请更详细:
{ "policy-enforcer": { "user-managed-access" : {}, "enforcement-mode" : "ENFORCING", "paths": [ { "path" : "/someUri/*", "methods" : [ { "method": "GET", "scopes" : ["urn:app.com:scopes:view"] }, { "method": "POST", "scopes" : ["urn:app.com:scopes:create"] } ] }, { "name" : "Some Resource", "path" : "/usingPattern/{id}", "methods" : [ { "method": "DELETE", "scopes" : ["urn:app.com:scopes:delete"] } ] }, { "path" : "/exactMatch" }, { "name" : "Admin Resources", "path" : "/usingWildCards/*" } ] } }
下面是每个配置选项的描述:
policy-enforcer
指定用来定义如何强制策略以及您要保护的路径(可选)的配置选项。如果没有指定,策略强制查询服务器以获取受保护的资源,以获取与受保护的资源服务器关联的所有资源。在这种情况下,您需要确保资源已使用与您要保护的路径匹配的 URIS 属性正确配置。
user-managed-access
指定适配器使用 UMA 协议。如果指定,适配器查询服务器进行权限问题单,并根据 UMA 规格将其返回到客户端。如果没有指定,策略强制器将可以根据常规访问令牌或 RPTs 来强制实施权限。在这种情况下,在令牌缺少权限时拒绝访问资源,策略强制程序会尝试直接从服务器获得权限。
enforcement-mode
指定如何强制实施策略。
ENFORCING
(默认模式)默认拒绝请求,即使没有与给定资源关联的策略。
PERMISSIVE
即使没有与给定资源关联的策略,也会允许请求。
DISABLED
完全禁用策略评估并允许访问任何资源。当
enforcement-mode
为DISABLED
应用程序时,仍然可以通过授权 上下文获取 Red Hat Single Sign-On 授予的所有权限
on-deny-redirect-to
定义 URL,在从服务器获取"访问被拒绝"消息时会重定向客户端请求。默认情况下,适配器以 403 HTTP 状态代码进行响应。
path-cache
定义策略执行程序如何跟踪您在红帽单点登录中定义的应用程序和资源中的路径之间的关联。缓存需要通过缓存路径和受保护的资源之间的关联来避免对 Red Hat Single Sign-On 服务器的不必要的请求。
lifespan
定义条目应过期的时间(毫秒)。如果没有提供,则默认值为 30000。等于 0 的值可以设置为完全禁用缓存。这样设置一个等于 -1 的值来禁用缓存的过期。
max-entries
定义应在缓存中保留的条目的限制。如果没有提供,则默认值为 1000。
paths
指定保护的路径。此配置是可选的。如果没有定义,策略强制器将通过获取您在红帽单点登录中定义为应用程序的资源来发现所有路径,其中使用代表应用程序中的一些路径的
URIS
定义这些资源。name
要与给定路径关联的服务器中资源的名称。与 路径 结合使用时,策略强制器忽略资源的 URIS 属性,并使用您提供的路径。
path
(必需)相对于应用程序的上下文路径的 URI。如果指定了这个选项,策略强制器会查询带有相同值的 URI 的服务器。目前支持为路径匹配提供非常基本的逻辑。有效路径示例包括:
-
通配符:
/*
-
后缀
:/*.html
-
sub-paths:
/path/*
- path 参数:/resource/{id}
- 确切匹配:/resource
- pattern: /{version}/resource, /api/{version}/resource, /api/{version}/resource/*
-
通配符:
方法
HTTP 方法(如 GET、POST、PATCH)来保护以及它们如何与服务器中给定资源的范围相关联。
方法
HTTP 方法的名称。
范围
与方法关联的范围的字符串数组。当您将范围与特定方法关联时,尝试访问受保护的资源(或路径)的客户端必须提供向列表中指定的所有范围授予权限的 RPT。例如,如果您使用范围 创建 定义了方法 POST,则 RPT 必须包含在向路径执行 POST 到路径时授予 create 范围的访问权限。
scopes-enforcement-mode
引用与方法关联的范围实施模式的字符串。值可以是 ALL 或 ANY。如果所有,则必须授予所有定义的范围,才能使用该方法访问资源。如果 ANY,应至少输入一个范围来访问使用该方法的资源。默认情况下,执行模式设置为 ALL。
enforcement-mode
指定如何强制实施策略。
ENFORCING
(默认模式)默认拒绝请求,即使没有与给定资源关联的策略。
- DISABLED
claim-information-point
定义必须解析并推送到 Red Hat Single Sign-On 服务器的一组或多个声明,以便这些声明可供策略使用。如需了解更多详细信息,请参阅声明信息点。
lazy-load-paths
指定适配器应该如何为与应用程序中的路径关联的资源获取服务器。如果为 true,则策略 enforcer 会根据请求的路径相应地获取资源。当您不想在部署过程中从服务器获取所有资源时(您没有提供
paths
)或您只定义了paths
的一个子集,并按需获取其他路径,则此配置特别有用。http-method-as-scope
指定范围应如何映射到 HTTP 方法。如果设置为 true,则策略强制器将使用当前请求的 HTTP 方法来检查是否应授予访问权限。启用后,请确保您的 Red Hat Single Sign-On 中的资源与代表您保护的每个 HTTP 方法的范围相关联。
claim-information-point
定义一个或多个 全局 声明,必须解析并推送到 Red Hat Single Sign-On 服务器,以便这些声明可用于策略。如需了解更多详细信息,请参阅声明信息点。