middlebury/dynamic-add-users

动态添加用户通过动态目录搜索替换了“添加用户”界面。

安装: 22

依赖: 0

建议者: 0

安全: 0

星级: 0

关注者: 2

分支: 0

开放问题: 2

类型:wordpress-plugin

1.3.2 2024-08-06 14:58 UTC

This package is auto-updated.

Last update: 2024-09-06 15:24:41 UTC


README

动态添加用户是一个WordPress插件,它使用动态目录搜索替换了原生的“添加用户”界面。

此插件还允许在目录中搜索组,并将组成员批量添加到网站中,同时根据组成员身份同步网站角色。它为其他插件提供了一些服务,这些服务可以用来查找用户和组,并将角色应用于用户。

组件

动态添加用户具有几个组件,它们协同工作以提供其功能

  • 一个用于管理配置和访问服务的 DynamicAddUsersPlugin 单例。
  • 一个具有提供程序的 目录 服务,允许查找用户和组信息。
  • 在登录时触发同步操作的 登录钩子 提供程序,并可能提供对登录响应中存在的用户标识符的访问。
  • 用户管理器组同步器 服务和API,用于创建用户帐户和批量添加用户。
  • 网络管理员配置界面。
  • 用于网站管理员的替代“添加用户”界面。

目录服务

动态添加用户 目录 服务提供了一个API,用于在底层数据源中按名称/电子邮件搜索用户。结果用户信息可以被其他组件利用,在用户无需登录的情况下,动态地将帐户配置到WordPress中。

每个 目录 服务实现都提供了在 DirectoryInterface.php 中定义的API方法。

  • getUsersBySearch($search)
  • getGroupsBySearch ($search)
  • getUserInfo ($login)
  • getGroupsForUser ($login)
  • getGroupMemberInfo ($groupId)

实现

  • - 默认启用空目录提供程序,允许动态添加用户屏幕仅与原生WordPress帐户一起使用,不查找外部数据源。
  • CAS目录 - CAS目录提供程序允许通过Middlebury的自定义CAS目录网络服务进行用户/组搜索和查找。使用需要配置服务的URL以及访问令牌。组通过其DistinguishedName属性(例如,CN=ITS Staff,OU=General,OU=Groups,DC=middlebury,DC=edu)标识,用户通过其middleburyCollegeUID属性标识。
  • Microsoft Graph - Graph目录提供程序允许通过Microsoft的Graph API在Azure AD中搜索和查找用户/组。组通过AzureAD中的ID属性引用(例如,20f74211-e62b-40f9-b00a-513a01a2e431)。用户通过一个可配置的主要标识符属性和一个可选的次要/后备标识符引用。可以对这些标识符应用转换,以便外部标识符符合WordPress对用户名的允许字符限制和长度限制。

登录钩子

动态添加用户 登录钩子 供应商在登录时评估用户/登录属性,将登录响应中存在的用户标识映射到目录服务已知用户标识。该组件允许挂钩到认证插件的自身登录操作,这些操作可能提供访问在原生WordPress wp_login 操作中不存在的附加属性。

每个 登录钩子 实现都将将自己注册到适当的登录操作中,并在可能的情况下,返回一个当前配置的目录服务已知的用户标识。

实现

  • 空值 - 此登录钩子默认启用,并始终返回空值。在调试或不需要映射时很有用。
  • 用户登录 - 此登录钩子挂钩到原生的 wp_login 操作,并始终返回WordPress用户账户中的 user_login 字段。如果这些值被当前配置的目录实现所知,则此登录钩子是合适的。它无需配置。
  • WP SAML Auth - 此登录钩子挂钩到 WP SAML Auth插件 的登录流程,并提供访问可能存在于该插件认证响应中的附加SAML属性。它需要配置在目录查找时使用的特定SAML属性。

配置

默认情况下,动态添加用户使用占位符空 目录登录钩子 实现。使用的实现和特定实现的配置可以在 网络管理员 → 设置 → 动态添加用户 下设置。

网络管理员设置还包括一个 测试 屏幕,允许验证当前配置及其操作。

APIs

动态添加用户提供了几个服务、操作和过滤器,其他插件可以使用它们来与其一起工作或扩展其功能。

使用服务

单例DynamicAddUsersPlugin提供了对插件所有服务的访问权限,可以通过 dynamic_add_users() 函数访问。配置的服务实现可以通过 DynamicAddUsersPluginInterface.php 中详细说明的方法访问: getDirectory()getLoginHook()getUserManager()getGroupSyncer()

示例

$userInfo = dynamic_add_users()->getDirectory()->getUserInfo($externalUserId);
$wordpressUser = dynamic_add_users()->getUserManager()->getOrCreateUser($userInfo);

操作和过滤器

dynamic_add_users__update_user_on_create

对新建的用户账户进行更改。如果新账户需要以某种方式更新,则此操作很有用。

示例

/**
 * Action: Make changes to a newly created user account.
 *
 * This plugin will call
 *   doAction('dynamic_add_users__update_user_on_create', $user)
 * when a user account is first created. Below is an example implementation.
 *
 * @param WP_User $user
 */
function dynamic_add_users__update_user_on_create(WP_User $user) {
  /*
  // Example: Set the authentication type for new accounts.
	if (defined('CAMPUSPRESS_AUTH_SHIBBOLETH')) {
	  update_usermeta($user->ID, 'shibboleth_account', true);
	}
  */
}

dynamic_add_users__update_user_on_login

根据组设置/清除用户的角色和能力。在登录时设置基于组的权限很有用。

示例

/**
 * Action: Set/unset roles and capabilities for the user based on groups.
 *
 * This plugin will call
 *   doAction('dynamic_add_users__update_user_on_login', $user, $groups)
 * when a user logs in. Below is an example implementation.
 *
 * @param WP_User $user
 * @param array $groups
 */
function dynamic_add_users__update_user_on_login(WP_User $user, array $groups) {
  /*
  // Example: Let institution users do something.
  if (in_array('CN=institution,OU=General,OU=Groups,DC=middlebury,DC=edu', $groups)) {
    $user->add_cap('middlebury_custom_capability');
  }
  // For all other users disallow this capability.
  else {
    $user->remove_cap('middlebury_custom_capability');
  }
  */
}

dynamic_add_users__filter_user_matches

在搜索用户时过滤目录结果。在向站点管理员展示搜索结果时,这可以用来移除服务账户或旧/已停用的账户。

示例

/**
 * Filter: Filter directory results when searching for users.
 *
 * Each match is an array like:
 *
 *  [
 *    'user_login' => '',
 *    'user_email' => '',
 *    'user_nicename' => '',
 *    'display_name' => '',
 *  ]
 *
 * This plugin will call
 *   apply_filters('dynamic_add_users__filter_user_matches', $matches)
 * when searches against the directory are run. Below is an example
 * implementation.
 *
 * @param array $matches
 * @return array The filtered matches.
 */
function dynamic_add_users__filter_user_matches($matches) {
  /*
  // Example: Filter out accounts prefixed with 'guest_'.
  $results = [];
  foreach ($matches as $match) {
    if (!preg_match('/^guest_[a-z0-9]{31,34}$/i', $match['user_login'])) {
      $results[] = $match;
    }
  }
  return $results;
  */
}

dynamic_add_users__filter_group_matches

从底层目录服务提供的组结果中过滤组。如果某些组不应该向站点管理员暴露,则此操作可能很有用。

示例

/**
 * Filter: Filter directory results when searching for groups.
 *
 * Each matches is an array of group ID => display name. Keys and values depend
 * on the directory implementation and should not have their format assumed.
 * Examples:
 *
 *  [
 *    '100' => 'All Students',
 *    '5' => 'Faculty',
 *  ]
 *
 * or
 *
 *  [
 *    'cn=All Students,OU=Groups,DC=middlebury,DC=edu' => 'All Students',
 *    'cn=Faculty,OU=Groups,DC=middlebury,DC=edu' => 'Faculty',
 *  ]
 *
 * This plugin will call
 *   apply_filters('dynamic_add_users__filter_group_matches', $matches)
 * when searches against the directory are run. Below is an example
 * implementation.
 *
 * @param array $matches
 * @return array The filtered matches.
 */
function dynamic_add_users__filter_group_matches($matches) {
  /*
  // Example: Filter out groups prefixed with 'xx' or 'zz'.
  $results = [];
  foreach ($matches as $id => $displayName) {
    if (!preg_match('/^(xx|zz).+$/i', $displayName)) {
      $results[$id] = $displayName;
    }
  }
  return $results;
  */
}

添加服务实现

插件可以通过在类中实现 \DynamicAddUsers\Directory\DirectoryInterface 并确保在DynamicAddUsers执行之前在运行时加载该类,为 目录 服务提供额外的实现。

插件可以通过在类中实现 \DynamicAddUsers\LoginHook\LoginHookInterface 并确保在DynamicAddUsers执行之前在运行时加载该类,为 登录钩子 提供额外的实现。