Blog sobre desarrollo WordPress en Español Desarrollo WordPress en Español
WordPress Roles

Cómo restringir el acceso al back-end de WordPress a usuarios no administradores

A continuación vamos a ver cómo bloquear o restringir el acceso al back-end o escritorio de WordPress (con y sin plugins), incluso ocultaremos el admin bar para evitar tentaciones de acceder al panel de control.

En muchas ocasiones nos puede interesar tener suscriptores en nuestro sitio, pero que no queramos dejarles acceder a su perfil en el panel de administración, sólo que puedan logearse, hacer comentarios, comprar productos, etc… y cerrar sesión. O simplemente que queramos dar acceso al back-end sólo a los usuarios con rol de administrador.

Existen varias maneras de restringir o bloquear el acceso a un tipo determinado de usuarios. La primera y más sencilla es hacer uso de un plugin. Existen varios, entre ellos podemos encontrar WP Secure que entre otras cosas te permite configurar el acceso al panel de administración, bloqueando por tipo de usuario o IP.

Restringir el acceso al back-end por IP

Si queremos bloquear el acceso al administrador de WordPress por IP, para que por ejemplo sólo podamos acceder desde nuestra casa u oficina, tendremos que añadir estas líneas en el fichero .htaccess de la raíz del sitio.

Podemos permitir el acceso a varias IPs, escribiendo tantos “Allow from” como queramos. A continuación, nos vamos a la carpeta wp-admin y creamos otro fichero .htaccess si no existe y escribimos éstas líneas dentro:

 

Restringir el acceso al back-end por rol de usuario

Como sabemos en WordPress existen hasta 6 tipos de roles diferentes: SuperAdministrador (para instalaciones de multisite), Administrador, Editor, Autor, Colaborador y Suscriptor. En algunos casos podemos tener la necesidad de bloquear el acceso a uno o varios tipos de roles.

wordpress user roles

Para ello vamos a usar la función current_user_can (si el usuario actual puede…) en el admin_init, para comprobar si el usuario que está intentando acceder cumple con nuestros requisitos o no, comprobando su rol. Ésta función acepta como parámetros la capacidad (capabilities) o el rol, por lo que podremos hacer cualquier ajuste según nuestras necesidades.

Si queremos dejar acceder sólo a Administradores preguntaremos si el usuario actual tiene rol de administrador: current_user_can(‘administrator’). Si quisiéramos dejar acceder solamente a Administradores y Editores tenemos dos opciones, podemos preguntar por (current_user_can(‘administrator’) || current_user_can(‘editor’)) o buscar una capability que sólo posean esos dos roles, por ejemplo edit_pages y preguntar por ella: current_user_can(‘edit_pages’).

Crearemos una función en nuestro archivo functions.php donde comprobaremos el rol del usuario que intenta acceder al panel de administración (en el admin-init) y si no cumple nuestros requisitos, le redirigimos a la home. Y a continuación crearemos otra función para ocultar la barra de administración que aparece en la parte superior (admin bar).

Hay que tener en cuenta que desde el front se pueden hacer solicitudes AJAX, y éstas necesitan acceso al área de administración (wp-admin/admin-ajax.php) y no deben ser bloqueadas.

Con esto conseguiremos bloquear el acceso al panel de administración a usuarios que no sean administradores. Si tratas de entrar con un rol inferior, el proceso de login se ejecuta correctamente pero serás redirigido siempre al front. Con esto quiero decir que tienes la sesión iniciada aunque no lo veas. Es por esto que en la siguiente entrada vamos a ver cómo crear un formulario de log-in/log-out en el front para permitir al resto de usuarios iniciar y cerrar sesión.

Puede que también te interese

Creando un plugin para WordPress parte 1: Planificación y planteamiento
Creando un plugin para WordPress parte 1: Planificación y planteamiento
1. Creando un plugin para WordPress: Planificación y planteamiento 2. Creando un plugin para WordPress: Estilo del Código 3. Creando un plugin para WordPress: Escribiendo…
Seguridad WordPress: cambiar el prefijo wp_ de la base de datos
Seguridad WordPress: cambiar el prefijo wp_ de la base de datos
Siguiendo la máxima de no dar facilidades a un posible atacante, una recomendación antes de instalar un WordPress es cambiar el prefijo de la base…
Eliminar código innecesario del wp_head
Eliminar código innecesario del wp_head
Por defecto WordPress incluye una serie de meta-tags en la cabecera de nuestro sitio a través de la función wp_head(). La mayoría de estas etiquetas…
Cómo cargar correctamente los archivos JS y CSS si estás desarrollando un tema o plugin a medida
Cómo cargar correctamente los archivos JS y CSS si estás desarrollando un tema o plugin a medida
En éste artículo vamos a tratar sobre cómo cargar correctamente los archivos JavaScript y hojas de estilo css si estás desarrollando un tema o plugin…




  • Andrés Felipe García Osorio

    Gracias por tu contribución justo lo que estaba buscando.

  • Leonardo Expósito Rojas

    Hola.. tengo una pregunta.. supongamos que quiero limitar el acceso a poder acceder desde toda una subred.. por ejemplo 192.168.1.* como sería..??? sería algo como “Allow from 192.168.1.XX” ???

    • Hola Leonardo,

      No lo he probado, pero creo que en tu caso te serviría poner: 192.168.1.0/255

      0/255 es el rango, podrías especificarlo más, por ejemplo: 24/99, y solo contemplaría las IPs:

      192.168.1.24
      192.168.1.25
      192.168.1.26

      192.168.1.99

      Pruébalo y me cuentas

  • César Rodríguez López

    Hola Pablo,

    He encontrado un ligerisimo error en el código que has publicado. Concretamente en la línea 9 del código para que solo puedan entrar en el backend los administradores.

    El problema es que cuando llamas a la función restrict_admin_area_by_rol, has puesto un espacio por delante y por detrás en las comillas. Simplemente, eliminamos esos dos espacios, y funciona correctamente.

    Te lo dije ayer en el Meetup de WordPress Madrid, y te lo repito hoy por aquí, muchas gracias por todas tus aportaciones, y por ayudarnos en tantas y tantas cosas de WordPress. Un abrazo.

    • Muchas gracias César! Ya está corregido! Un saludo