¿Cómo evitar el acceso a wp-admin para ciertos roles de usuario?

24 sept 2012, 12:59:59
Vistas: 41.9K
Votos: 11

Intenté usar el plugin Front End Users pero esto genera conflictos ya que impide el acceso a algunas páginas del front-end. Por lo tanto, necesito configurar manualmente que cualquier persona que no sea uno de dos nombres de usuario (o roles) no pueda acceder a wp-admin.

0
Todas las respuestas a la pregunta 6
17
19

Plugin

Básicamente es solo una verificación de capacidad de usuario, seguida de un redireccionamiento en una llamada de salida. Luego redirige al sitio desde donde vino la solicitud.

<?php
! defined( 'ABSPATH' ) AND exit;
/* Plugin Name: (#66093) »kaiser« Denegar acceso a la interfaz de administración para ciertos roles */


function wpse66093_no_admin_access()
{
    // No ejecutar si el usuario ha iniciado sesión y está intentando cerrar sesión
    // Esto podría necesitar una o dos verificaciones más.
    // Especialmente si tienes reglas y rutas personalizadas para inicio/cierre de sesión, restablecimiento de contraseña, etc.
    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 );

Ten en cuenta que esto solo debe funcionar con configuraciones predeterminadas (ver comentarios en el código). Lógica personalizada de inicio de sesión, cierre de sesión, registro o restablecimiento de contraseña podría romper esto.

Roles vs. Capacidades: Como los nombres de los roles pueden cambiar y dado que los roles son solo grupos de capacidades, es mejor verificar contra una capacidad, no contra un nombre de rol. Puedes encontrar una lista de roles y capacidades integrados aquí. Solo mira cuál es el acceso más restrictivo y busca una capacidad coincidente. Luego asígnala arriba. Eso es más fácil de mantener, en caso de que un nombre de rol cambie. Sí, también puedes usar un nombre de rol, lo cual funcionará en WordPress, pero es un concepto que traerá un error difícil de rastrear cuando un nombre de rol cambie.

Nota: No pienses en los roles de manera jerárquica. Piensa en el contador cuya dirección de correo electrónico ingresas en algún backend de SaaS para recibir la factura. La mayoría de los desarrolladores no tendrán acceso a los detalles de facturación y el contador tampoco tendrá acceso a configuraciones de implementación o credenciales de seguridad. Tienen roles con nombres diferentes con capacidades igualmente "altas", pero para partes completamente diferentes. Ten este ejemplo en mente cuando escribas verificaciones de capacidades o agregues capacidades personalizadas a un sistema.

24 sept 2012 14:42:31
Comentarios

¿Entonces pongo esto al principio de mi archivo functions.php?

Claire Claire
24 sept 2012 15:54:05

Ya sea en algún lugar de tu functions.php, o en tu carpeta de plugins o mu-plugins. Como esto no es algo sobre mostrar contenido, pertenece en mi opinión a un plugin, de ahí el encabezado de plugin. Esto tiene el beneficio de que esta funcionalidad no se pierda cuando cambias de tema. Simplemente cambia los nombres de los roles de usuario, súbelo y listo.

kaiser kaiser
24 sept 2012 15:59:31

No funciona. Cambié los nombres de los roles de usuario por mis dos roles que pueden acceder. Luego lo cambié a una capacidad como Add users y todavía puedo acceder al backend con otro rol de usuario

Claire Claire
24 sept 2012 18:28:36

@Nicola Hay una gran diferencia entre una etiqueta en la interfaz de usuario (por ejemplo: "Añadir usuarios") y un Rol o Capacidad real - en tu caso add_users.

kaiser kaiser
24 sept 2012 20:07:56

Ok gracias, probé el código anterior con add_users y aún no funciona... si inicio sesión como un usuario sin esa capacidad, puedo navegar a wp-admin

Claire Claire
26 sept 2012 14:44:14

@Nicola ¿Has visto el enlace sobre Roles y Capacidades ↑ en el comentario anterior? Por favor asegúrate de que el usuario realmente no tenga esa capacidad.

kaiser kaiser
26 sept 2012 14:48:22

Oye, definitivamente no tienen esa capacidad. Acabo de poner el código en mi archivo functions.php porque no estaba seguro de cómo agregarlo como un plugin que WordPress reconociera. Además, tuve un error donde $_SERVER['HTTP_REFERER'] era un índice indefinido, así que puse una regla if isset antes.

Claire Claire
26 sept 2012 15:13:39

Ah, vale. Ahora sabemos dónde está el problema: actualicé la respuesta, pero debería agregar esto como un plugin. Es uno, será reconocido. Simplemente no agregué el encabezado completo (que no es necesario). También puedes ejecutarlo como mu-plugin (lee en el codex al respecto). Es mejor mantenerlo como plugin para que no se pierda al cambiar de tema.

kaiser kaiser
26 sept 2012 15:28:01

Vale, ¿puedes editarlo para hacerlo if isset? Ya que está activando ese índice indefinido 'HTTP_REFERER' de nuevo, y no estoy seguro de tu lógica para saber si lo edito correctamente.

Claire Claire
26 sept 2012 16:17:23

oye, está genial, simplemente hice que redirija a la página de inicio del sitio. ¡Ahora funciona, gracias!

Claire Claire
26 sept 2012 16:20:13

Hola de nuevo, tengo otro requisito. Tengo un plugin que permite a un usuario actualizar su foto desde el frontend. Este plugin tiene que hacer algunas cosas de ajax en el backend para lograr eso.

Así que en el código anterior, supongo que necesito hacer una verificación para saber si estamos en esa página. Sin embargo, como estamos en el directorio del plugin, no conoce la página actual mediante funciones de WordPress, así que usé $page = array_shift( explode( '?', $_SERVER['REQUEST_URI'] ) );, y luego intenté editar el código anterior para decir if ( current_user_can( 'add_users' ) || $page=="/your-profile/"){ pero no funciona.

Claire Claire
8 oct 2012 12:05:20

@Nicola Por favor siempre agrega esa información a tu pregunta inicial como edición, no en un comentario aquí. Segundo, por favor ve y haz una nueva pregunta cuando tu tema cambie o se extienda. Gracias.

kaiser kaiser
8 oct 2012 12:07:37

Está bien, lo solucioné llamando a un die($page) y me di cuenta de que el plugin solo se llamaba al hacer clic en editar perfil, momento en el que $page="/wp-admin/admin-ajax.php". Ya está solucionado.

Claire Claire
8 oct 2012 12:08:24

Vale, disculpa por eso

Claire Claire
8 oct 2012 12:08:57

WordPress probablemente comenzará a activar un _doing_it_wrong() al verificar un nombre de rol como capacidad en current_user_can(). Ver 38653

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

Bien, sin embargo los usuarios no pueden cerrar sesión debido a esta acción.

berend berend
29 jun 2017 13:00:03

Recuerda verificar defined('DOING_AJAX') si tienes llamadas AJAX en el frontend, ¡o serán bloqueadas!

Ste_95 Ste_95
19 ago 2020 09:46:18
Mostrar los 12 comentarios restantes
0

Acabo de revisar esa respuesta ya que no se actualizaba desde hace mucho tiempo. El año es 2021.

La respuesta aceptada verifica si la página actual es una página wp-login.php O una página de administración MIENTRAS se usa un hook admin_init, lo cual no tiene sentido.

admin_init se dispara cuando se inicializa una pantalla o script de administración. NO solo se ejecuta en pantallas de administración orientadas al usuario. También se ejecuta en admin-ajax.php y admin-post.php.

En ningún caso se disparará en un wp-login.php ya que NO es una pantalla de administración. Sin embargo, sí se disparará en una solicitud ajax, por lo que ese caso debe manejarse. wp_doing_ajax() determina si la solicitud actual es una solicitud Ajax de WordPress.

En el siguiente ejemplo, estoy usando la capacidad de usuario delete_posts para permitir el acceso al backend de WordPress a los roles de admin, editor y author. Consulta la Tabla de Capacidades vs. Roles para un enfoque más restrictivo.

Como recordatorio, aquí están los roles predeterminados de WordPress (Resumen de Roles):

super admin admin editor author contributor subscriber.

En una instalación de WordPress de un solo sitio, los Administradores son, en efecto, Super Admins.

He elegido usar wp_die() en lugar de redirigir ciegamente a los usuarios. wp_die() ofrece un tipo de orientación al usuario, ya que detiene la ejecución de WordPress y muestra una página HTML con un mensaje de error. El mismo enfoque podría hacerse redirigiendo a los usuarios a una página 404. Cualquier cosa que explique la situación es mejor que una redirección ciega a la página de inicio.

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( 'Acceso restringido.', 'Error', $args );
        };
    };
};

Para evitar la redirección predeterminada a wp-admin.php después del inicio de sesión, estoy usando el filtro de hook login_redirect, que filtra la URL de redirección de inicio de sesión. Los estoy redirigiendo a su propia página de perfil usando get_author_posts_url(), pero puedes redirigir fácilmente a cualquier página que desees. También podrías redirigir condicionalmente según el rol del usuario (por ejemplo: admin a la página de administración, el resto al perfil), todo está explicado en la sección de ejemplos de la página 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 respuesta aceptada menciona User Role pero en realidad utiliza la función para User Capability.

Aquí está la solución para 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 abr 2015 18:17:51
Comentarios

Debes verificar capacidades en lugar de roles. Como se indica en la página CODEX de la función current_user_can(): "Aunque verificar roles específicos en lugar de una capacidad es parcialmente compatible, esta práctica no se recomienda ya que puede producir resultados poco confiables. @see https://developer.wordpress.org/reference/functions/current_user_can/#description

amarinediary amarinediary
7 ene 2022 13:16:50
0

Basado en la respuesta proporcionada por @kaiser (gracias por cierto), este es mi código funcional, por si alguien lo necesita. Se coloca en el archivo functions.php.

La condición utilizada es si el usuario no puede 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 sept 2015 12:11:25
0

Con la respuesta de @kaiser descubrí que necesitarás utilizar el hook admin_menu en lugar de admin_init, ya que se dispara antes de la verificación !user_can_access_admin_page() en wp-admin/includes/menu.php. De lo contrario, si el usuario no tiene acceso de 'lectura' al escritorio, simplemente obtendrá la página 'No tienes permisos suficientes para acceder a esta página.' en lugar de ser redirigido.

8 abr 2016 03:02:38
1

Si eliminas la capacidad read del Rol, el usuario no podrá acceder al panel de control. Recibirá el siguiente error:

No tienes permisos suficientes para acceder a esta página de administración.

Razón: El usuario actual no tiene la capacidad "read" que es requerida para acceder al elemento de menú "Escritorio".

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

25 feb 2019 19:15:47
Comentarios

vale la pena mencionar que un usuario sin capacidades aún puede iniciar sesión con éxito y se muestra la barra de administración.

kubi kubi
20 may 2020 16:29:19