主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

根据用户自定义 Web App 行为

注意

独立 MATLAB® Web App Server™ 产品支持根据用户自定义 Web App 行为的功能,而 MATLAB Compiler™ 中包含的开发版本则不支持。有关详细信息,请参阅MATLAB Web App Server 差异

前提条件

  • 在服务器上启用 SSL。有关详细信息,请参阅启用 SSL

  • 在服务器上启用身份验证。有关详细信息,请参阅身份验证

创建 userinfo.json 文件

您可以根据登录的用户自定义 Web App 的行为。自定义行为:

  1. 创建一个名为 userinfo.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

  2. 在使用 MATLAB 中的 App 设计工具创作 Web App 时,请使用 App 代码中的 compiler.UserInfo (MATLAB Compiler) 函数从 userinfo.json 文件中检索用户特定的详细信息。

userinfo.json 的 JSON 架构是:

{
    "version": "<major>.<minor>.<patch>",
    "userInfo.doc": "Property values to be fetched during login from IdP",
    "userInfo": {
      "UserID": "<uid_or_upn>",
      "DisplayName": "<user_name_that_is_displayed>",
      "Groups": "<group_membership_of_user>",
      "<propertyName1>": "<value1>",
      "<propertyName2>": "<value2>",
      "<propertyName3>": "<value3>",
      ...      
    },
    "appAccess.doc": "Policy for allowing access to user properties within an app or group of apps",
    "appAccess": {
      "<appName>": ["<userInfo_propertyName>","<userInfo_propertyName>", ...],
      ...
      "*": "*"
    }
  }

  • version:指定 JSON 架构的版本。R2024b 的默认值是 1.0.0

  • userInfo.doc:描述 userInfo 模块的用途的文本。

  • userInfouserInfo 模块包含有助于识别用户的属性名称和值的列表。每个 userinfo.json 文件中都需要属性名称 UserIDDisplayNameGroups。可以根据需要包含其他属性名称和值。属性名称和值对应于 LDAP 或 OIDC 属性。例如,如果您想使用电子邮件地址作为用户信息的一部分,则可以指定 Email 作为属性名称,并指定 EmailAddress 的属性值作为属性值。

  • UserID:指定与用户 ID 相对应的 LDAP 或 OIDC 属性类型作为属性值。UserID 是必需的属性名称。例如:

    "UserID": "uid"

    如果没有为 UserID 属性名称指定属性类型作为属性值,则查询用户详细信息的 compiler.UserInfo (MATLAB Compiler) 将返回 <missing> 作为属性值。

  • DisplayName:指定与用户首选名称相对应的 LDAP 或 OIDC 属性类型。例如:

    "DisplayName": "displayName"
  • Groups:指定与用户所属组对应的 LDAP 或 OIDC 属性类型。例如:

    "Groups": "groups"

    注意

    每个 userinfo.json 文件中都需要 UserIDDisplayNameGroups 属性名称。您可以向 userInfo 模块添加自定义属性名称,并根据 LDAP 或 OIDC 属性类型分配属性值。例如,如果您想使用电子邮件地址作为用户信息的一部分,则可以指定 Email 作为属性名称,并指定 LDAP 属性类型 EmailAddress(如果使用 OIDC,则为 mail)作为属性值。

  • appAccess.doc:描述 appAccess 模块的用途的文本。

  • appAccessappAccess 模块包含与服务器上托管的 App 名称相对应的属性名称列表,以及与 userInfo 模块中的属性名称相对应的属性值列表。您可以通过指定 userInfo 模块中的属性名称组合来设置对 App 的访问权限,以识别一组唯一的用户。

  • <appName>:指定 App 名称作为属性名称,并指定来自 userInfo 模块的属性名称组合作为属性值,以唯一标识一组可以访问该 App 的用户。例如:

    "BloodPressure": ["UserID", "Email"]

提示

  • 您可以使用星号 (*) 通配符作为属性名称和属性值,以指示所有用户都可以访问所有 App。例如:

    "*": "*"

  • 属性名称 WebAppsRoleWebAppsDisplayName 是保留的,不能在 userInfo 模块中使用。但是,它们可以在 appAccess 模块中用作属性值。例如:

     "Mystery": ["UserID", "Email", "WebAppsRole", "WebAppsDisplayName"]

    • WebAppsRole 对应用户的角色:作者用户。有关详细信息,请参阅基于角色的访问

    • WebAppsDisplayName 对应 App 主页上显示的名称。

  • 如果您在 userInfo 模块中做了任何更改,则必须重新启动服务器。有关详细信息,请参阅 webapps-restart

使用 userinfo.json 文件和 compiler.UserInfo 函数的示例

在以下示例 userinfo.json 文件中,userInfo 模块包含所需的属性名称:UserIDDisplayNameGroups。此外,它包含两个自定义属性名称,LastNameEmail。所有属性名称都被分配 OIDC 属性作为属性值。

appAccess 模块包含三个 App:BloodPressureMortgageMystery

  • 根据 userInfo 模块的 UserIDDisplayName 属性,对 BloodPressure App 的访问受到限制。

  • 根据 userInfo 模块的 UserIDLastName 属性,对 Mortgage App 的访问受到限制。

  • 根据 UserIDDisplayName 以及保留属性名称 WebAppsRoleWebAppsDisplayName 限制对 Mystery App 的访问。

{
    "version": "1.0.0",
    "userInfo.doc": "Property values to be fetched during login from IdP",
    "userInfo": {
      "UserID": "upn",
      "DisplayName": "displayName",
      "Groups": "groups",
      "LastName": "surname",
      "Email": "mail"
    },
    "appAccess.doc": "Policy for allowing access to user properties within an app or group of apps",
    "appAccess": {
      "BloodPressure": ["UserID","Email"],
      "Mortgage": ["UserID","LastName"],
      "Mystery": ["UserID","Email","WebAppsRole","WebAppsDisplayName"]
    }
  }

鉴于上面的 userinfo.json 文件,BloodPressure App 可以在 App 代码中使用 compiler.UserInfo 函数,如下所示:

function startupFcn(app)
try
    user = compiler.UserInfo();
catch me
    error(me.message);
    return
end

if ~ismissing(user.UserID)
    % app code
    % Example:
    % app.userIDLabel.Text = [app.userIDLabel.Text user.UserID];
end
if isprop(user, 'Email')
    % app code
    % Example:
    % app.EmailLabel.Text = [app.EmailLabel.Text user.Email];
end
...

鉴于上面的 userinfo.json 文件,Mystery App 可以在 App 代码中使用 compiler.UserInfo 函数,如下所示:

function startupFcn(app)
try
    user = compiler.UserInfo();
catch me
    error(me.message);
    return
end

if isprop(user, 'WebAppsDisplayName')
    % app code
    % Example:
    % app.DisplayNameLabel.Text = [app.DisplayNameLabel.Text user.WebAppsDisplayName];
end
if isprop(user, 'WebAppsRole')
    % app code
    % Example:
    % app.RoleLabel.Text = [app.RoleLabel.Text user.WebAppsRole];
end
...

另请参阅

(MATLAB Compiler)