允许访问有限的 API 端点

问题描述 投票:0回答:1

我有一个自定义策略,它将限制对 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 .

enter image description here

如果我需要反转该行为(即仅允许访问端点 /api/endpoint-1 和 /api/endpoint-2,对于 client_id:fbcfa238-2071-42c6-8e16-c9f8890249df),可以进行哪些更改在定制政策中制定?非常感谢任何见解。

yaml mule mulesoft
1个回答
0
投票

要仅允许访问已配置的端点,只需将选择中的条件更改为“==”而不是“!=”。但是,这会使 API 中的其他端点变得不安全。

考虑一个具有三个端点的 API:端点 1、端点 2 和端点 3。现在,更新后的策略实现允许 ID 为 fbcfa238-2071-42c6-8e16-c9f8890249df 的客户端按预期访问端点 1 和 2。但此客户端也可以访问端点 3。发生这种情况是因为端点 3 仍然不受自定义策略配置的保护,这是选择“将配置应用于特定 API 方法和资源”选项的结果。

要完全保护您的 API,请应用自定义策略的另一个实例,以使用不易预测的客户端 ID 来保护其余端点。您在 API 管理器中的策略配置将如下所示:

策略 1(允许访问特定端点):

  • 客户端 1 -fbcfa238-2071-42c6-8e16-c9f8890249df
  • 允许的端点 = 端点 1 和端点 2

策略 2(保护剩余端点):

  • 随机客户端 = UnexlatedClientID
  • 允许的端点=端点3

现在,端点 3 实际上不会暴露给任何客户端。如果您稍后决定将端点 3 公开给不同的客户端,甚至与策略 1 中的同一客户端,则需要相应地更新策略 2 配置。 这通常涉及将随机客户端 ID (UnexlatedClientID) 替换为您希望授予访问权限的实际客户端 ID。

© www.soinside.com 2019 - 2024. All rights reserved.