モジュールのインストールフックでいくつかの新しいロールを定義しています。そのうちの1つは「admin light」ロールであり、すべてではなく一部の管理者アカウント権限が必要です。
事前に定義されたモジュールのリスト(ユーザー、ノード、ツールバーなど)から使用可能な権限のリストを実用的に作成し、それらをロールに割り当てる必要があります。すべての許可文字列をハードコーディングする必要はありません。
Drupal 7では、次のようなことができます:
$modules = array( 'user', 'node', 'toolbar' );
foreach( $modules as $module) {
$permission_hook = $module . '_permisson';
if( module_exists( $module ) && function_exists( $permission_hook ) ) {
user_role_grant_permissions( $rid, array_keys( $permission_hook() ) );
}
}
Drupal 8 _hook_permssion
が$module.permission.yml
のために削除されたように見えるため、適切な解決策を見つけるのに苦労しています。何か足りないものはありますか?
編集:最終的な解決策:これは、他の誰かがこれを行う必要がある場合に備えて、最終的な実装です。
// Define our new roles
$roles = array(
array(
'id' => 'mymodule_client',
'label' => 'Client',
'mymodule_permissions' => array(
'view project status reports',
),
),
array(
'id' => 'mymodule_agent',
'label' => 'Agent',
'mymodule_permissions' => array(
'view projects',
'view project status reports',
),
),
array(
'id' => 'mymodule_agent_manager',
'label' => 'Agent Manager',
'mymodule_permissions' => array(
'view projects',
'administer projects',
'view project status reports',
),
),
array(
'id' => 'mymodule_employee',
'label' => 'Employee',
'mymodule_permissions' => array(
'view projects',
'administer projects',
'view project status reports',
'view project financial reports',
),
// Assign all permissions for the listed modules to this role
'provider_permissions' => array(
'user', 'node', 'toolbar'
),
),
);
// At the default level all roles should have the same permissions as authenticated users
$permissions = Role::load( Role::AUTHENTICATED_ID )->getPermissions();
// Get permissions for all modules and add them to an array keyed by the module
$provider_permissions = array();
foreach( \Drupal::service('user.permissions')->getPermissions() as $key => $permission ) {
$provider_permissions[ $permission['provider'] ][] = $key;
}
// Lets loop our new permissions and create them
foreach( $roles as $role_values ) {
// Merge our modules bespoke permissions with the authenticated role permissions
$permissions = array_merge( $permissions, $role_values['mymodule_permissions'] );
// Remove our module permissions before we create the role
unset( $role_values['mymodule_permissions'] );
// If the role needs access to other module permissions merge them in
if( isset( $role_values['provider_permissions'] ) && is_array( $role_values['provider_permissions'] ) ) {
foreach( $role_values['provider_permissions'] as $module ) {
if( array_key_exists( $module, $provider_permissions ) ) {
$permissions = array_merge( $permissions, $provider_permissions[ $module ] );
}
}
// Remove the module_permissions before we build the role
unset( $role_values['provider_permissions'] );
}
// Create the role
$role = Role::create( $role_values );
// Assign all the required permissions
foreach( $permissions as $permission ) {
$role->grantPermission( $permission );
}
// Save the role
$role->save();
}
このコードは、認証されたロールをベースとして使用し、モジュールのアクセス許可(ロールごとに定義)を追加し、それを必要とするロールに他のモジュールのアクセス許可を追加します。
PermissionHandler を使用して、使用可能なすべての権限を一覧表示できます。
$permissions = \Drupal::service('user.permissions')->getPermissions();
アクセス許可のprovider
プロパティにモジュール名があります。
$permissions_by_provider = [];
foreach ($permissions as $key => $permission) {
$permissions_by_provider[$permission['provider']][] = $key;
}