web-dev-qa-db-fra.com

Comment filtrer le sélecteur de rôle?

Je sais que les rôles dans WordPress ne sont pas hiérarchiques, mais je me demande s’il existe une quelconque capacité à "affecter des utilisateurs à des rôles". Tout ce que je peux voir si pouvoir ajouter des utilisateurs ou non.

Le vrai stimulant, c’est que j’ai utilisé le plug-in Membres de Justin Tadlock pour créer un nouveau rôle, appelé "Clients", qui supprime tout ce qu’ils ne devraient pas voir ou ne devraient pas être en mesure de contrôler - ce qui fonctionne très bien.
Mais, si je leur donne la possibilité de créer un nouvel utilisateur, ils peuvent également choisir mon rôle de "super administrateur", qui peut tout voir. Donc, d’une certaine manière, ils trompent un peu le système.

Est-il possible de "masquer" un certain rôle pour qu'un utilisateur puisse définir un nouvel utilisateur/modifier un utilisateur? Ou éventuellement supprimer l'identifiant de rôle de l'écran d'ajout/modification d'utilisateur en fonction de son rôle?
Je sais que cela ressemble un peu à ce que WordPress est censé faire pour les autorisations des utilisateurs, mais d’un point de vue administratif, cela semble utile - du moins dans ma tête;)

Merci!

3
Zach

L'élément de sélection de l'interface utilisateur

Sur user-edit.php, vous voyez le menu déroulant dans l'interface utilisateur. Le wrapper déroulant <select> est codé en dur.

Ensuite, l'interface d'administration fait une chose astucieuse 1) selon le commentaire en ligne: // Get the highest/primary role for this user. En fait, c'est le rôlefirstqui a été attribué à l'utilisateur (ceci doit être pris en compte).

Ensuite, il n’ya qu’un appel à wp_dropdown_roles(). Cette fonction ne fait rien d'autre que de parcourir en boucle les rôles disponibles et de les envelopper dans des éléments <option>. Mais , il y a une chose kool qu'il fait: il utilise les rôles récupérés par get_editable_roles(). Et voici la magie! Un filtre pour le global $wp_roles->roles. Par défaut, cela retourneallrôles, mais vous pouvez sauter et simplement désélectionner ce que vous voulez.

// Add this as mu-plugin
function wpse32738_get_editable_roles( $editable_roles )
{
    if ( current_user_can( 'client' ) )
        // unset whatever you need here.

    return $editable_roles;
}
add_filter( 'editable_roles', 'wpse32738_get_editable_roles' );

1) Les rôles sont un système "plat". Un rôle peut avoir des fonctionnalités qui prévalent sur d'autres fonctionnalités.

7
kaiser

J'ai suivi les instructions de Kaiser et écrit le code suivant qui me permet d'attribuer des fonctions de gestion des utilisateurs à un rôle spécifique et d'empêcher l'ascension des privilèges vers tout rôle intégré (mon code doit être modifié si vous définissez des rôles intermédiaires personnalisés).

// add user-management capabilities
add_action('admin_init', function() {
  $role = get_role( 'editor' );

  $role->add_cap( 'list_users' );
  $role->add_cap( 'create_users' );
  $role->add_cap( 'edit_users' );
  $role->add_cap( 'delete_users' );
});

// prevent privilege escalation
add_filter( 'editable_roles', function( $editable_roles ) {
  if ( ! current_user_can( 'promote_users' ) ) {
    // always remove admin roles
    if ( isset($editable_roles['super_admin']) ) {
      unset( $editable_roles['super_admin'] );
    }
    unset( $editable_roles['administrator'] );

    // remove other roles conditionnaly to prevent escalation
    if ( ! current_user_can( 'editor' ) ) {
      unset( $editable_roles['editor'] );

      if ( ! current_user_can( 'author' ) ) {
        unset( $editable_roles['author'] );

        if ( ! current_user_can( 'contributor' ) ) {
          unset( $editable_roles['contributor'] );
        }
      }
    }
  }

  return $editable_roles;
});

Avec ce code, un contributeur peut se voir attribuer des capacités de gestion des utilisateurs, et il/elle ne devrait pouvoir créer que d’autres contributeurs ou abonnés.

ATTENTION: il s’agit d’une solution simple, elle n’a pas été testée en mode réseau et aucune validation d’entrée n’est effectuée: un utilisateur malveillant pourrait toujours élever ses privilèges!

1
Louis-Rémi