基于策略的访问
注意
独立 MATLAB® Web App Server™ 产品支持基于策略的访问,而 MATLAB Compiler™ 中包含的开发版本则不支持。有关详细信息,请参阅MATLAB Web App Server 差异。
前提条件
创建 webapps_acc_ctl.json
文件
通过在服务器上启用基于策略的访问,您可以创建基于属性的规则,允许经过身份验证的主体访问服务器上的 Web App。
要启用基于策略的访问:
检查 SSL 是否启用。有关详细信息,请参阅启用 SSL。
检查是否启用了身份验证,并验证在
webapps_authn.json
文件中指定了userAttributeName
和/或groupAttributeName
值。有关详细信息,请参阅身份验证。检查服务器上的
apps
根文件夹中是否存在文件夹。虽然文件夹对于启用基于策略的访问不是必需的,但使用文件夹可以让您组织 Web App 并将其指定为可访问的资源。有关详细信息,请参阅创建文件夹来组织 Web App。创建一个名为
webapps_acc_ctl.json
的文件并将其放在webapps_private
文件夹中。webapps_private
文件夹位于以下位置:操作系统 文件夹位置 Windows®
%ProgramData%\MathWorks\webapps\R2024b\config\webapps_private
Linux®
/local/MathWorks/webapps/R2024b/config/webapps_private
macOS
/Library/Application Support/MathWorks/webapps/R2024b/config/webapps_private
webapps_acc_ctl.json
的 JSON 架构是:
{
"version": "<major>.<minor>.<patch>",
"policy": [
{
"id": "<policy_id>",
"description": "<policy_description>",
"rule": [
{
"id": "<rule_id>",
"description": "<rule_description>",
"subject": { "<attribute_name_of_auth_subject>": [ "<attribute_value_of_auth_subject>" ] },
"resource": { "<app OR folder>": [ "<app_name OR folder_name>" ] },
"action": [ "<action_type>" ]
},
{
"id": "<rule_id>",
"description": "<rule_description>",
"subject": { "<attribute_name_of_auth_subject>": [ "<attribute_value_of_auth_subject>" ] },
"resource": { "<app OR folder>": [ "<app_name OR folder_name>" ] },
"action": [ "<action_type>" ]
}
]
}
]
}
version:指定 JSON 架构的版本。R2024b 的默认值是
1.0.0
。policy:策略模块包含基于策略的访问所需的策略列表。一个策略文件中只能指定一个策略。
id:为该策略指定策略 ID。策略 ID 必须是一组字母数字字符。任何前导或尾随空格均会被删除。例如:
"id" : "policy420"
description:指定策略的描述。例如:
"description" : "Company policy for accessing web apps."
rule:规则模块包含规则对象列表。一个规则模块中可以存在多条规则。每条规则都需要一个 ID,并且每条规则的
<rule_id>
必须是唯一的。id:为每个规则指定唯一的规则 ID。规则 ID 必须是一组字母数字字符。任何前导或尾随空格均会被删除。例如:
"id" : "rule101"
description:为每个规则指定一个描述。例如:
"description" : "Only the Hercules group can run the BloodPressure app."
subject:指定可以访问资源的经过身份验证的主体的属性名称 - 值对。
例如:
"subject": { "memberOf": ["CN=Middle,OU=middle,ou=groups,DC=school,DC=com"] }
"subject": { "groups": ["Sales"] }
"subject": { "uid": ["fbueller", "cfrye"] }
如果您正在使用 Azure® 活动目录并且需要检索组 ID,请参阅 使用 Azure Active Directory。
resource:指定可访问的资源类型和名称。仅支持
app
或folder
类型的资源。如果您未指定资源,那么即使服务器上存在该 App 或文件夹,经过身份验证的主体也将无法访问它。有关如何创建文件夹的信息,请参阅创建文件夹来组织 Web App。例如,指定对根级别的 App 的访问权限:
"resource": { "app": ["BloodPressure"] }
例如,指定对特定文件夹中 App 的访问权限:
"resource": { "app": ["MagicFolder/CardTricks"] }
例如,指定对特定文件夹中所有 App 的访问:
"resource": { "folder": ["MagicFolder"] }
例如,指定对根文件夹中所有 App 的访问:
"resource": { "folder": ["/"] }
action:指定经过身份验证的主体可以执行的操作类型。如果资源类型是
app
,则支持的操作是execute
,这使得主体可以运行 Web App。如果资源类型是folder
,则支持的操作是execute
和modify
。在本例中,execute
操作允许主体运行指定文件夹中的所有 Web App。如果主体在webapps_app_roles.json
基于角色的访问文件中被分配了作者的角色,则modify
操作允许主体将 Web App 上传到文件夹或从文件夹删除 Web App。在webapps_app_roles.json
基于角色的访问文件中被分配了用户角色的主体即使被分配了modify
操作,也无法将 Web App 上传到文件夹或从文件夹删除 Web App。例如:"action": ["execute", "modify"]
有关详细信息,请参阅基于角色的访问。
LDAP 身份验证的示例 webapps_acc_ctl.json
文件
{
"version": "1.0.0",
"policy" : [
{
"id": "policy1001",
"description": "Web Apps Access Control Policy",
"rule": [
{
"id": "rule101",
"description": "Sales group can run the BloodPressure app.",
"subject": { "memberOf": ["cn=Sales,ou=sales,ou=groups,dc=example,dc=com"] },
"resource": { "app": ["BloodPressure"] },
"action": ["execute"]
},
{
"id": "rule102",
"description": "Specified subjects can run the CardTricks app in the MagicDir folder.",
"subject": { "uid": ["erooney"] },
"resource": { "app": ["MagicDir/CardTricks"] },
"action": ["execute"]
},
{
"id": "rule103",
"description": "Specified subjects can run all apps in the MagicDir folder and modify (upload or delete) apps in MagicDir folder.",
"subject": { "uid": ["fbueller"] },
"resource": { "folder": ["MagicDir"] },
"action": ["execute", "modify"]
},
{
"id": "rule104",
"description": "Specified subjects can run all apps under the DayOff folder.",
"subject": { "uid": ["cfrye", "psloane"] },
"resource": { "folder": ["DayOff"] },
"action": ["execute"]
},
{
"id": "rule105",
"description": "Specified subjects can run all apps in the apps root folder and modify (upload or delete) apps in the apps root folder.",
"subject": { "uid": ["jbueller"] },
"resource": { "folder": ["/"] },
"action": ["execute", "modify"]
}
]
}
]
}
小心
请严格执行 webapps_acc_ctl.json
的 JSON 架构语法。架构语法中的错误可能导致服务器无法启动,或者在尝试登录时拒绝您访问服务器。
将基于策略的访问与身份验证和基于角色的访问结合使用
基于策略的身份验证访问
如果使用基于策略的访问,则必须在
webapps_authn.json
身份验证文件的appConfig
模块中包含以下属性并设置适当的值:userAttributeName
groupAttributeName
如果未能包含并设置这些属性的值,则会导致服务器无法启动。有关详细信息,请参阅身份验证。
如果您使用基于策略的访问,并在
webapps_authn.json
身份验证文件中设置userAttributeName
和groupAttributeName
的值,则webapps_acc_ctl.json
基于策略的访问文件中subject
属性指定的属性必须与您在身份验证文件中设置的值匹配。身份验证文件(webapps_authn.json) 基于策略的访问文件 (webapps_acc_ctl.json) "userAttributeName": "
<value>
", "groupAttributeName": "<value>
""subject": { "
<attrib>
": ["..."] } "subject": { "<attrib>
": ["..."] }例如,如果您在
webapps_authn.json
身份验证文件中设置以下值:"userAttributeName": "uid", "groupAttributeName": "memberOf"
然后,
webapps_acc_ctl.json
基于策略的访问文件必须使用相同的值:"subject": { "uid": ["..."] }
"subject": { "memberOf": ["..."] }
JSON 文件中的属性不匹配导致服务器无法启动。有关详细信息,请参阅基于策略的访问。
注意
您可以使用基于策略的访问,并进行独立于基于角色的访问的身份验证。然而,这种访问类型导致经过身份验证的主体只能执行 Web App 而不能修改它们。
基于策略和角色的身份验证访问
如果您同时使用基于策略的访问和基于角色的访问,并在
webapps_authn.json
身份验证文件中设置userAttributeName
和/或groupAttributeName
的值,则webapps_acc_ctl.json
基于策略的访问文件中的subject
属性指定的属性以及groups
和users
属性指定的属性必须与您在身份验证文件中设置的值匹配。身份验证文件 ( webapps_authn.json
)基于策略的访问文件 ( webapps_acc_ctl.json
)基于角色的访问文件 ( webapps_app_roles.json
)"userAttributeName": "
<value>
", "groupAttributeName": "<value>
""subject": { "
<attrib>
": ["..."] } "subject": { "<attrib>
": ["..."] }"users": { "
<attrib>
": ["..."] } "groups": { "<attrib>
": ["..."] }例如,如果您在
webapps_authn.json
身份验证文件中设置以下值:"userAttributeName": "uid", "groupAttributeName": "memberOf"
然后,
webapps_app_roles.json
基于角色的访问文件必须使用相同的属性:"appRoles": [ { "id": "User", "description": "User role info", "groups": { "memberOf": ["..."] }, "users": { "uid": ["..."] } }, { "id": "Author", "description": "Author role info", "groups": { "memberOf": ["..."] }, "users": { "uid": ["..."] } } ]
并且,
webapps_acc_ctl.json
基于策略的访问文件必须使用相同的值:"subject": { "memberOf": ["..."] }
"subject": { "uid": ["..."] }
值不匹配会导致服务器无法启动。有关详细信息,请参阅基于角色的访问。
注意
当您使用基于策略的访问和基于角色的访问进行身份验证时,必须在 webapps_app_roles.json
基于角色的访问文件中为经过身份验证的主体分配作者角色,并在 webapps_acc_ctl.json
基于策略的访问文件中将 modify
作为操作,以便主体能够修改 Web App。