Role Delegation
サイト管理者が「administer permissions」権限を付与することなく、特定のロールに対して選択したロールをユーザーに割り当てる権限を付与できるようにします。
role_delegation
インストール
composer require 'drupal/role_delegation:8.x-1.4'
composer require 'drupal/role_delegation:8.x-1.2'
composer require 'drupal/role_delegation:8.x-1.1'
概要
Role Delegationモジュールは、ロール割り当て機能のきめ細かな制御を可能にします。強力な「administer permissions」権限をユーザーに付与する代わりに、サイト管理者は特定のロールを割り当てる機能を指定されたユーザーロールに委譲できます。
システムで定義された各ロールに対して、Role Delegationは対応する「assign [role] role」権限を自動的に生成します。ユーザーがこれらの権限の1つ以上(または「assign all roles」権限)を持っている場合、複数のインターフェースを通じてロール割り当て機能にアクセスできます:ユーザープロフィールの専用「Roles」タブ、ユーザー編集フォームのロールチェックボックス、およびユーザー管理ページでの一括ロール追加/削除操作です。
このモジュールは、異なる管理者が異なるタイプのユーザーを管理する必要がある組織で特に有用です。例えば、部門マネージャーに管理者ロールへのアクセス権を与えることなく、「editor」や「contributor」ロールを割り当てる権限を付与できます。
Features
- システム内の各ロールに対して「assign [role] role」権限を動的に生成
- ロール管理用のユーザープロフィール専用「Roles」タブ(/user/{uid}/roles)を提供
- ユーザー管理ページに「Roles」エンティティ操作リンクを追加
- ユーザーが委譲権限を持っている場合、role_changeフィールドを追加してユーザー編集フォームと統合
- ユーザーの委譲権限に基づいてロール追加/削除アクションをフィルタリングするためにViews Bulk Operationsと統合
- 「administer users」権限なしで動作するようにコアのAddRoleUserおよびRemoveRoleUserアクションをオーバーライド
- ロールが削除されると、すべてのロールから「assign [role] role」権限を自動的に取り消し
- チェックボックスとラジオボタン入力の両方を処理してsingle_user_roleモジュールをサポート
Use Cases
部門ベースのロール管理
大規模な組織には複数の部門があり、それぞれに独自の「department editor」ロールがあります。部門マネージャーはチームメンバーにエディターロールを割り当てる必要がありますが、管理者ロールにはアクセスできないようにする必要があります。各マネージャーに「assign [department]_editor role」権限を付与することで、サイトのセキュリティを損なうことなくチームのアクセスを管理できます。
コンテンツモデレーションの委譲
編集ワークフローでは、シニアエディターがユーザーを「reviewer」または「publisher」ロールに昇格させる必要があります。シニアエディターに完全な権限管理権を与える代わりに、「assign reviewer role」と「assign publisher role」権限を付与します。技術的または管理的なロールへのアクセスを制限しながら、コンテンツチームの階層を管理できます。
人事部門によるユーザーオンボーディング
人事スタッフは、部門と職務に基づいて適切なロールで新しい従業員アカウントを設定する必要があります。人事ユーザーに「assign all roles」または特定の部門ロール権限を付与します。他の管理エリアにアクセスすることなく、Rolesタブを通じてユーザー設定を完了できます。
セルフサービスのロールリクエスト
リクエスト/承認ワークフローモジュールと組み合わせることで、ユーザーは特定のロールをリクエストし、マネージャーが承認できます。マネージャーは、ユーザーのRolesタブにアクセスして承認を完了するために、それらの特定のロールの委譲権限のみが必要です。
一時的な権限昇格
サポートスタッフは、ユーザーを支援するために一時的に昇格した権限が必要になることがあります。「assign support_admin role」権限を持つチームリーダーは、完全なサイト管理者を介さずに、必要に応じてチームメンバーにこのロールを一時的に付与し、後で取り消すことができます。
Tips
- 「assign all roles」は控えめに付与してください - 権限設定を変更する能力なしに「administer permissions」と同じロール割り当て権限を提供します
- Rolesタブは、委譲権限を持ち「administer users」権限を持たないユーザーのユーザープロフィールにのみ表示されます
- ロール委譲はViews Bulk Operationsと連携し、/admin/peopleから複数のユーザーに一度にロールを割り当てるのを効率的にします
- ロールが削除されると、すべての「assign [role] role」権限が他のロールから自動的に取り消されます
- モジュールはロール管理への素早いアクセスのために、ユーザー管理ページのドロップダウンメニューに「Roles」操作リンクを追加します
Technical Details
Admin Pages 1
/user/{user}/roles
特定のユーザーのロール割り当てを管理するための専用フォームです。このページには、現在のユーザーが割り当て権限を持つ各ロールのチェックボックスが表示されます。ユーザーはロールをチェックまたはチェック解除して保存し、対象ユーザーのロール割り当てを更新できます。このページは、少なくとも1つの「assign [role] role」権限または「assign all roles」権限を持ち、「administer users」権限を持たないユーザーのみがアクセスできます(後者のユーザーは標準のユーザー編集フォームを使用する必要があります)。
権限 2
Hooks 12
hook_help
ヘルプページでモジュールのヘルプテキストを提供します。
hook_user_role_delete
ロールが削除されたときに「assign [role] role」権限をクリーンアップします。削除されたロールを割り当てる権限を持つすべてのロールを見つけ、その権限を取り消します。
hook_user_presave
role_changeフィールドを通じて送信されたロール変更を処理します。チェックされたロールを追加し、チェック解除されたロールを削除しますが、現在のユーザーが割り当て権限を持つロールに対してのみ行います。
hook_user_load
ユーザーがロードされたときにrole_change computedフィールドに空のフィールド値マーカーを設定します。これにより、意図的なロール削除とフィールドデータの欠落を区別できます。
hook_form_user_form_alter
role_changeフィールドをアカウントグループに配置するようにユーザーフォームを変更し、フィールドにアクセスできない場合を処理するエンティティビルダーを追加します。
hook_field_widget_single_element_form_alter
computedフィールドは値を保存しないため、ユーザーの現在のロールに基づいてrole_changeウィジェットのデフォルト値を設定します。
hook_options_list_alter
role_changeエンティティ参照フィールドのオプションをフィルタリングして、現在のユーザーが割り当てることができるロールのみを表示します。
hook_entity_base_field_info
ユーザーエンティティに「role_change」computedベースフィールドを追加します。このフィールドはoptions_buttonsウィジェットを持つuser_roleへのエンティティ参照を使用します。
hook_entity_field_access
role_changeフィールドへの編集アクセスを制御します。ユーザーが「administer permissions」を持っている場合はアクセスを拒否します(通常のrolesフィールドを使用する必要があります)。ユーザーがロール委譲権限を持っている場合はアクセスを許可します。
hook_entity_operation
admin/peopleページのユーザーエンティティに/user/{uid}/rolesへリンクする「Roles」操作リンクを追加します。
hook_views_data_alter
委譲権限に基づいて一括操作をフィルタリングするため、user_bulk_form Viewsフィールドプラグインをrole_delegation_user_bulk_formでオーバーライドします。
hook_action_info_alter
コアのAddRoleUserおよびRemoveRoleUserアクションクラスを、「administer users」権限なしで動作するロール委譲バージョンに置き換えます。
Troubleshooting 5
これは予期された動作です。「administer users」権限を持つユーザーは、完全なrolesフィールドを含む標準のユーザー編集フォームを使用する必要があります。Rolesタブは、ロールを委譲できるが、ユーザーを完全に管理できないユーザー向けに設計されています。
これは予期された動作です。「administer permissions」を持つユーザーは、ユーザー編集フォームの標準のrolesフィールドにアクセスできます。role_changeフィールドは、重複するロール選択インターフェースを避けるため、これらのユーザーには非表示になります。
ユーザーが少なくとも1つの「assign [role] role」権限または「assign all roles」権限を持っていることを確認してください。一括フォームフィールドはこれらの権限に基づいてアクションをフィルタリングします。
ユーザーが割り当てようとしているロールに対する特定の権限を持っていることを確認してください。モジュールは現在のユーザーが委譲権限を持つロールの変更のみを処理し、許可されていない変更は黙って無視します。
モジュールはhook_user_role_deleteを介してロールが削除されたときに「assign [role] role」権限を自動的に取り消します。権限が残っている場合は、drush crでキャッシュをクリアしてください。
Security Notes 5
- 「assign all roles」権限は、管理者ロールを含む任意のロールの割り当てを許可するため、「restrict access: TRUE」としてマークされています
- ユーザーは明示的に委譲権限を持っていないロールを割り当てることはできません - モジュールは現在のユーザー権限に対してすべてのロール変更を検証します
- モジュールは、標準の権限インターフェースをバイパスすることを防ぐため、「administer permissions」を持つユーザーがrole_changeフィールドを使用することを防止します
- ロール委譲権限は、ロール定義の作成、削除、または変更の機能を付与しません - 既存のロールをユーザーに割り当てる機能のみを付与します
- ロールが削除されると、関連する委譲権限が自動的にクリーンアップされ、孤立した権限参照を防ぎます