我有一个自定义策略,它将限制对 Mule 中某些 API 端点的访问。下面给出了策略 template.xml 和 yaml 文件(免责声明:请注意,这可能不是一个很好的实现,因为我才刚刚开始)
<?xml version="1.0" encoding="UTF-8"?>
<mule
xmlns="http://www.mulesoft.org/schema/mule/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:http-policy="http://www.mulesoft.org/schema/mule/http-policy"
xmlns:http-transform="http://www.mulesoft.org/schema/mule/http-policy-transform"
xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http-policy http://www.mulesoft.org/schema/mule/http-policy/current/mule-http-policy.xsd
http://www.mulesoft.org/schema/mule/http-policy-transform http://www.mulesoft.org/schema/mule/http-policy-transform/current/mule-http-policy-transform.xsd">
<http-policy:proxy name="{{{policyId}}}-custom-policy">
<http-policy:source>
<try>
<choice>
{{#clientID}}
<when expression="#['{{{.}}}'!={{{clientIdExpression}}}]">
<logger level="INFO" message="Route Found"/>
</when>
{{/clientID}}
<otherwise>
<raise-error type="CUSTOM:NOT_ALLOWED"
description="#['Access Denied for this API resource']"/>
</otherwise>
</choice>
<error-handler>
<on-error-propagate type="CUSTOM:NOT_ALLOWED">
<http-transform:set-response statusCode="403">
<http-transform:body>#[
output application/json
---
{"error": "Access Forbidden"}]
</http-transform:body>
</http-transform:set-response>
</on-error-propagate>
</error-handler>
</try>
<http-policy:execute-next/>
</http-policy:source>
</http-policy:proxy>
</mule>
YAML 文件
#YAML File
id: Test
name: Test
description: Custom Policy used to restrict client access at API EndPoint level. This is designed to use with OpenId Connect access token enforcement policy.
category: Custom
type: custom
violationCategory: authentication
resourceLevelSupported: true
encryptionSupported: false
standalone: true
requiredCharacteristics: []
providedCharacteristics: []
configuration:
- propertyName: clientIdExpression
name: Client ID Expression
description: Mule Expression to be used to extract the Client ID from API requests
type: string
defaultValue: "authentication.properties.userProperties.client_id"
optional: false
sensitive: false
allowMultiple: false
- propertyName: clientName
name: Client Name
description: Name of the external client that uses this policy
type: string
defaultValue: []
optional: false
sensitive: false
allowMultiple: false
- propertyName: clientID
name: Client ID
description: Client ID that needs to be restricted
type: string
optional: false
sensitive: false
allowMultiple: true
defaultValue: []
根据下面的屏幕截图(这是策略配置),它将限制对端点 /api/endpoint-1 和 /api/endpoint-2 的访问,对于 client_id:fbcfa238-2071-42c6-8e16-c9f8890249df .
如果我需要反转该行为(即仅允许访问端点 /api/endpoint-1 和 /api/endpoint-2,对于 client_id:fbcfa238-2071-42c6-8e16-c9f8890249df),可以进行哪些更改在定制政策中制定?非常感谢任何见解。
要仅允许访问已配置的端点,只需将选择中的条件更改为“==”而不是“!=”。但是,这会使 API 中的其他端点变得不安全。
考虑一个具有三个端点的 API:端点 1、端点 2 和端点 3。现在,更新后的策略实现允许 ID 为 fbcfa238-2071-42c6-8e16-c9f8890249df 的客户端按预期访问端点 1 和 2。但此客户端也可以访问端点 3。发生这种情况是因为端点 3 仍然不受自定义策略配置的保护,这是选择“将配置应用于特定 API 方法和资源”选项的结果。
要完全保护您的 API,请应用自定义策略的另一个实例,以使用不易预测的客户端 ID 来保护其余端点。您在 API 管理器中的策略配置将如下所示:
策略 1(允许访问特定端点):
策略 2(保护剩余端点):
现在,端点 3 实际上不会暴露给任何客户端。如果您稍后决定将端点 3 公开给不同的客户端,甚至与策略 1 中的同一客户端,则需要相应地更新策略 2 配置。 这通常涉及将随机客户端 ID (UnexlatedClientID) 替换为您希望授予访问权限的实际客户端 ID。