web-dev-qa-db-ja.com

プログラムでモジュール許可リストを作成する

モジュールのインストールフックでいくつかの新しいロールを定義しています。そのうちの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();
  }

このコードは、認証されたロールをベースとして使用し、モジュールのアクセス許可(ロールごとに定義)を追加し、それを必要とするロールに他のモジュールのアクセス許可を追加します。

3
Lyndon Cox

PermissionHandler を使用して、使用可能なすべての権限を一覧表示できます。

$permissions = \Drupal::service('user.permissions')->getPermissions();

アクセス許可のproviderプロパティにモジュール名があります。

$permissions_by_provider = [];
foreach ($permissions as $key => $permission) {
  $permissions_by_provider[$permission['provider']][] = $key;
}
6
4k4