middlebury / dynamic-add-users
动态添加用户通过动态目录搜索替换了“添加用户”界面。
Requires
- microsoft/microsoft-graph: ^1.45
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执行之前在运行时加载该类,为 登录钩子 提供额外的实现。