Come impedire l'accesso a wp-admin per determinati ruoli utente?

24 set 2012, 12:59:59
Visualizzazioni: 41.9K
Voti: 11

Ho provato a utilizzare il plugin Front End Users ma questo crea conflitti con qualcos'altro poiché impedisce l'accesso ad alcune pagine del front-end. Quindi ho bisogno di impostare manualmente in modo che chiunque non sia uno dei due nomi utente (o ruoli) non possa accedere a wp-admin.

0
Tutte le risposte alla domanda 6
17
19

Plugin

È fondamentalmente solo un controllo delle capacità dell'utente, seguito da un reindirizzamento in una chiamata exit. Reindirizza quindi al sito da cui è arrivata la richiesta.

<?php
! defined( 'ABSPATH' ) AND exit;
/* Plugin Name: (#66093) »kaiser« Nega l'accesso all'interfaccia di amministrazione per determinati ruoli */


function wpse66093_no_admin_access()
{
    // Non eseguire se l'utente è loggato e sta cercando di fare il logout
    // Potrebbero servire uno o due controlli aggiuntivi.
    // Specialmente se hai regole e percorsi personalizzati per login/logout/reimpostazione password ecc.
    if ( 
        ! is_admin()
        || (
            is_user_logged_in()
            && isset( $GLOBALS['pagenow'] ) AND 'wp-login.php' === $GLOBALS['pagenow']
        )
    ) {
        return;
    }

    $redirect = isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : home_url( '/' );
    if ( 
        current_user_can( 'CAPABILITY_NAME_HERE' )
        OR current_user_can( 'CAPABILITY_NAME_HERE' )
    )
        exit( wp_redirect( $redirect ) );
}
add_action( 'admin_init', 'wpse66093_no_admin_access', 100 );

Tieni presente che dovrebbe funzionare solo con le impostazioni predefinite (vedi commenti nel codice). Logiche personalizzate per login, logout, registrazione o reimpostazione password potrebbero interromperlo.

Ruoli vs. Capacità: Poiché i nomi dei ruoli possono cambiare e poiché i ruoli sono solo gruppi di capacità, è meglio verificare una capacità piuttosto che un nome di ruolo. Puoi trovare un elenco di ruoli e capacità incorporati qui. Basta vedere qual è l'accesso più restrittivo e cercare una capacità corrispondente. Quindi assegnarla sopra. È più facile da mantenere, nel caso in cui cambi il nome di un ruolo. Sì, puoi usare anche un nome di ruolo, che funzionerà in WordPress, ma è un concetto che porterà con sé un bug difficile da rintracciare quando un nome di ruolo cambia.

Nota: Non pensare ai ruoli in modo gerarchico. Pensa al contabile di cui inserisci l'indirizzo email in un backend SaaS per ricevere la fattura. La maggior parte degli sviluppatori non avrà accesso ai dettagli di fatturazione e nemmeno il contabile avrà accesso alle impostazioni di distribuzione o alle credenziali di sicurezza. Hanno ruoli con nomi diversi con capacità ugualmente "alte", ma per parti completamente diverse. Tieni presente questo esempio quando scrivi controlli di capacità o aggiungi capacità personalizzate a un sistema.

24 set 2012 14:42:31
Commenti

quindi metto questo all'inizio del mio file functions.php?

Claire Claire
24 set 2012 15:54:05

O in qualunque punto del tuo functions.php, o nella cartella del plugin o mu-plugins. Poiché questo non riguarda la visualizzazione di contenuti, secondo me appartiene a un plugin, da qui l'intestazione del plugin. Questo ha il vantaggio che la funzionalità non vada persa quando cambi tema. Basta modificare i nomi dei ruoli utente, caricarlo e il gioco è fatto.

kaiser kaiser
24 set 2012 15:59:31

Non funziona. Ho cambiato i nomi dei ruoli utente con i miei due ruoli che possono accedervi. Poi l'ho cambiato in una capacità, ad esempio Add users, e sono ancora in grado di accedere al backend con un altro ruolo utente

Claire Claire
24 set 2012 18:28:36

@Nicola C'è una differenza enorme tra un'etichetta nell'interfaccia utente (ad esempio: "Aggiungi utenti") e un vero Ruolo o Capability - nel tuo caso add_users.

kaiser kaiser
24 set 2012 20:07:56

ok grazie, ho provato il codice sopra con add_users invece e ancora non funziona... se accedo come un utente senza quella capability, posso comunque navigare in wp-admin

Claire Claire
26 set 2012 14:44:14

@Nicola Hai dato un'occhiata al link su Ruoli e Capabilities ↑ nel commento sopra? Assicurati che l'utente davvero non abbia quella capability.

kaiser kaiser
26 set 2012 14:48:22

Ehi, sicuramente non hanno quella funzionalità. Ho appena inserito il codice nel mio file functions.php perché non ero sicuro su come aggiungerlo come plugin che WordPress riconoscesse. Inoltre, ho avuto un errore dove $_SERVER['HTTP_REFERER'] era un indice non definito, quindi ho aggiunto una regola if isset prima

Claire Claire
26 set 2012 15:13:39

Ah, ok. Ora sappiamo dov'è il problema: ho aggiornato la risposta, ma dovrei aggiungerlo come plugin. Lo è, verrà riconosciuto. Semplicemente non ho aggiunto l'header completo (che non è necessario). Puoi anche eseguirlo come mu-plugin (leggi sul codex a riguardo). È meglio mantenerlo come plugin così non si perde al cambio del tema.

kaiser kaiser
26 set 2012 15:28:01

Ok, puoi modificarlo per renderlo if isset visto che sta scatenando di nuovo quell'indice non definito 'HTTP_REFERER' e non sono sicuro della tua logica per sapere se lo modifico correttamente.

Claire Claire
26 set 2012 16:17:23

ehi, è fantastico, ho semplicemente impostato il reindirizzamento alla homepage del sito. Ora funziona, grazie!

Claire Claire
26 set 2012 16:20:13

Ciao ancora, ho un altro requisito. Ho un plugin che permette a un utente di aggiornare la propria foto dal front end. Questo plugin deve fare alcune operazioni ajax nel backend per poterlo fare.

Quindi nel codice sopra, penso di dover fare un controllo per verificare se siamo su quella pagina. Tuttavia, visto che siamo nella directory del plugin, non riconosce la pagina corrente tramite le funzioni di WordPress, quindi ho usato $page = array_shift( explode( '?', $_SERVER['REQUEST_URI'] ) );, e poi ho provato a modificare il codice sopra per dire if ( current_user_can( 'add_users' ) || $page=="/your-profile/"){ ma non funziona.

Claire Claire
8 ott 2012 12:05:20

@Nicola Per favore sempre aggiungi tali informazioni alla tua domanda iniziale come modifica, non in un commento qui. Secondo, per favore vai e fai una nuova domanda quando il tuo argomento cambia o si estende. Grazie.

kaiser kaiser
8 ott 2012 12:07:37

Va bene, ho risolto chiamando un die($page) e ho realizzato che il plugin veniva chiamato solo quando cliccavo su modifica profilo, a quel punto $page="/wp-admin/admin-ajax.php". Ora è risolto.

Claire Claire
8 ott 2012 12:08:24

ok, scusa per quello

Claire Claire
8 ott 2012 12:08:57

WordPress probabilmente inizierà a generare un _doing_it_wrong() quando si controlla un nome ruolo come capacità in current_user_can(). Vedi 38653

Nathan Johnson Nathan Johnson
16 apr 2017 19:43:10

Bello, però gli utenti non riescono a disconnettersi a causa di questa azione.

berend berend
29 giu 2017 13:00:03

Ricorda di verificare defined('DOING_AJAX') se hai chiamate AJAX nel frontend, altrimenti verranno bloccate!

Ste_95 Ste_95
19 ago 2020 09:46:18
Mostra i restanti 12 commenti
0

Ho rivisitato quella risposta poiché non era aggiornata da molto tempo. L'anno è il 2021.

La risposta accettata controlla se la pagina corrente è una pagina wp-login.php OPPURE una pagina di amministrazione MENTRE utilizza un hook admin_init, il che non ha senso.

admin_init viene attivato quando una schermata o script di amministrazione viene inizializzato. NON viene eseguito solo sulle schermate di amministrazione visibili agli utenti. Viene eseguito anche su admin-ajax.php e admin-post.php.

In nessun caso verrà attivato su wp-login.php poiché NON è una schermata di amministrazione. Tuttavia, verrà attivato su una richiesta ajax, quindi quel caso dovrebbe essere gestito. wp_doing_ajax() determina se la richiesta corrente è una richiesta Ajax di WordPress.

Nell'esempio seguente utilizzo la capacità utente delete_posts per consentire l'accesso al backend di WordPress a admin, editor e author. Per un approccio più restrittivo, consulta la Tabella Capacità vs. Ruoli.

Come promemoria, ecco i ruoli predefiniti di WordPress (Riassunto dei Ruoli):

super admin admin editor author contributor subscriber.

Con un'installazione WordPress a singolo sito, gli Amministratori sono, in effetti, Super Amministratori.

Ho scelto di utilizzare wp_die() invece di reindirizzare ciecamente gli utenti. wp_die() offre una sorta di onboarding per l'utente poiché interrompe l'esecuzione di WordPress e visualizza una pagina HTML con un messaggio di errore. Lo stesso approccio potrebbe essere fatto reindirizzando gli utenti a una pagina 404. Qualsiasi cosa che spieghi la situazione è meglio di un reindirizzamento cieco alla home page.

add_action( 'admin_init', 'restrict_wpadmin_access' );
if ( ! function_exists( 'restrict_wpadmin_access' ) ) {
    function restrict_wpadmin_access() {
        if ( wp_doing_ajax() || current_user_can( 'delete_posts' ) ) {
            return;
        } else {
            header( 'Refresh: 2; ' . esc_url( home_url() ) );
            $args = array(
                'back_link' => true,
            );
            wp_die( 'Accesso limitato.', 'Errore', $args );
        };
    };
};

Per prevenire il reindirizzamento predefinito a wp-admin.php dopo il login, utilizzo il filtro hook login_redirect che filtra l'URL di reindirizzamento al login. Li reindirizzo alla loro pagina del profilo utilizzando get_author_posts_url(), ma puoi facilmente reindirizzare a qualsiasi pagina desideri. Potresti anche reindirizzare in modo condizionale in base al ruolo dell'utente (es: admin alla pagina di amministrazione, gli altri al profilo), tutto è spiegato nella sezione degli esempi della pagina CODEX.

add_filter( 'login_redirect', 'redirect_user_to_profile_on_login', 10, 3 );
if ( ! function_exists( 'redirect_user_to_profile_on_login' ) ) {
    function redirect_user_to_profile_on_login( $redirect_to, $requested_redirect_to, $user ) {
        if ( $user && is_object( $user ) && is_a( $user, 'WP_User' ) ) {
            $redirect_to = esc_url( get_author_posts_url( $user->ID ) );
        };
        return $redirect_to;
    };
};
25 mar 2021 13:20:20
1

La risposta accettata menziona User Role ma in realtà utilizza la funzione per User Capability.

Ecco la soluzione per User Roles:

function wpse66094_no_admin_access() {
    $redirect = isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : home_url( '/' );
    global $current_user;
    $user_roles = $current_user->roles;
    $user_role = array_shift($user_roles);
    if($user_role === 'YOUR_USER_ROLE_HERE'){
        exit( wp_redirect( $redirect ) );
    }
}

add_action( 'admin_init', 'wpse66094_no_admin_access', 100 );
6 apr 2015 18:17:51
Commenti

Dovresti verificare le capacità (capabilities) anziché i ruoli. Come indicato nella pagina CODEX della funzione current_user_can(): "Sebbene il controllo basato su ruoli specifici invece che su capacità sia in parte supportato, questa pratica è sconsigliata in quanto potrebbe produrre risultati inaffidabili. @see https://developer.wordpress.org/reference/functions/current_user_can/#description

amarinediary amarinediary
7 gen 2022 13:16:50
0

Basandosi sulla risposta fornita da @kaiser (grazie comunque), questo è il mio codice funzionante, nel caso qualcuno ne avesse bisogno. Va inserito nel file functions.php.

La condizione utilizzata è se l'utente non può manage_options o edit_posts.

function wpse66093_no_admin_access() {
    $redirect = home_url( '/' );
    if ( ! ( current_user_can( 'manage_options' ) || current_user_can( 'edit_posts' ) ) )
        exit( wp_redirect( $redirect ) );
}
add_action( 'admin_init', 'wpse66093_no_admin_access', 100 );
4 set 2015 12:11:25
0

Con la risposta di @kaiser ho scoperto che è necessario utilizzare l'hook admin_menu invece di admin_init, poiché viene eseguito prima del controllo !user_can_access_admin_page() in wp-admin/includes/menu.php. Altrimenti, se l'utente non ha accesso 'read' alla dashboard, otterrà semplicemente la pagina 'Non disponi delle autorizzazioni sufficienti per accedere a questa pagina.' invece di essere reindirizzato.

8 apr 2016 03:02:38
1

Se rimuovi la capacità read dal ruolo, l'utente non sarà in grado di accedere alla dashboard. Riceverà il seguente errore:

Non hai i permessi sufficienti per accedere a questa pagina di amministrazione.

Motivo: l'utente corrente non dispone della capacità "read" richiesta per accedere alla voce di menu "Dashboard".

Rif: https://codex.wordpress.org/Roles_and_Capabilities#read

25 feb 2019 19:15:47
Commenti

forse vale la pena notare che un utente senza capacità può comunque accedere con successo e la barra di amministrazione viene visualizzata.

kubi kubi
20 mag 2020 16:29:19