Cómo crear una sección privada para nuestros usuarios

Proteger una categoría de WordPress con nombre de usuario y contraseña

Proteger contenido WordPress con contraseñaWordPress permite proteger fácilmente nuestras páginas y entradas con contraseña, pero no es posible (al menos sin utilizar algún plugin que probablemente añada otras 100 funciones más que no necesitamos) bloquear el acceso a toda una categoría y proteger así todas las entradas que contiene.

Aunque protejamos todas las entradas de una categoría determinada con contraseña, al visitar la página de archivo de esa categoría seguirán apareciendo los títulos, y eso a veces también se quiere evitar.

La opción que tendría más sentido en este caso sería publicar las entradas como “privadas”, para ocultar completamente el contenido y que no sean visibles en la parte pública de la web más que para los usuarios que tengan permisos suficientes. Pero esto supone tener que crear usuarios de WordPress, darles permisos (por defecto, de editor o administrador) y explicarles cómo acceder al sistema.

Una solución intermedia perfecta sería proteger una categoría con contraseña: permitiría un acceso fácil y rápido a cualquier visita, la contraseña podría ser única para todos y, además, al publicar contenido sólo tendríamos que guardarlo en esta nueva categoría protegida.

Soluciones

La primera solución que viene a la mente es proteger el directorio a nivel de servidor, ya sea a través de las opciones del gestor (cPanel, Plesk, etc.), o bien añadiendo directamente los archivos .htaccess y .htpasswd dentro de la carpeta que se corresponde con la categoría que queremos proteger. Por ejemplo, si la categoría se llamara “privado”, crearíamos una carpeta nueva en la raiz de la instalación de WordPress con el mismo nombre.

Pero el problema es que el directorio es virtual (la carpeta “/privado/” no existe en realidad), y en WordPress los directorios reales tienen preferencia sobre los virtuales. Es decir, si creamos una carpeta llamada igual que la categoría, la protección funcionará correctamente, pero nos aparecerá el mensaje “Forbidden, You don’t have permission to access /privado/ on this server“, simplemente porque WordPress no ha podido hacer la reescritura de la URL correctamente, y además no existe ningún archivo dentro de esa carpeta.

Si no podemos crear directorios que coincidan con las URLs que gestiona WordPress a través del módulo mod_rewrite, hay que buscar otra solución, a ser posible, que no suponga editar la configuración de Apache.

Proteger con contraseña un directorio virtual con htaccess y htpasswd

Como se trata de un directorio virtual, cualquier retoque que hagamos tiene que ocurrir antes de que entre en acción la redirección de URLs de WordPress. Para ello podemos utilizar el módulo mod_setenvif de Apache en el archivo htaccess principal.

Lo primero de todo conviene hacer una copia de seguridad del archivo htaccess que vamos a modificar, ya que es muy sensible a los errores y cualquier cosa de más o de menos hará que la web deje de funcionar.

A continuación editamos el archivo añadiendo un bloque que incluya estas reglas (si copias y pegas, ten en cuenta que hay que editar algunas cosas para que funcione):

# --------------------------------
# Protección con contraseña
# de categoría y entradas
# --------------------------------
SetEnvIfNoCase Request_URI "^/categoria/privado" SECURED
SetEnvIfNoCase Request_URI "^/privado" SECURED
AuthType Basic
AuthName "Acceso restringido"
AuthUserFile /var/www/vhosts/midominio.com/httpdocs/.htpasswd
Require valid-user
Satisfy any
Order allow,deny
Allow from all
Deny from env=SECURED

En las dos primeras lineas (lineas 5 y 6 del ejemplo anterior) especificamos lo que queremos proteger. En este caso queremos bloquear dos cosas: el acceso a la página de la categoría y también el acceso a las entradas guardadas dentro de esa categoría (que empezarán con “/privado/…” o con el nombre que le hayamos dado). Si tenemos que bloquear el acceso a otras páginas podemos añadir más lineas como las anteriores.

Después tenemos que definir (en la linea 9) la ruta al archivo “.htpasswd”, que contendrá los nombres de los usuarios y las contraseñas (cifradas con MD5) con este formato:

usuario:contraseña-MD5
otrousuario:otracontraseña-MD5

Para crear este archivo podemos utilizar este generador de contraseñas para htpasswd, donde sólo hay que introducir el nombre de usuario y la clave que queremos utilizar. La herramienta nos generará el formato correcto y cifrará automáticamente la contraseña utilizando MD5.

Al subir estos dos archivos (htaccess y htpasswd) al servidor, si todo ha ido bien, el navegador nos mostrará un cuadro con el mensaje “Se requiere autenticación” y la opción de añadir el nombre de usuario y la contraseña cuando visitemos alguna de las direcciones especificadas más arriba.

Pero falta un paso más: excluir la categoría privada del canal de actualizaciones RSS.

Cómo excluir la categoría del feed RSS

Para hacer nuestra categoría protegida un poco más privada, habrá que evitar que se publique en las actualizaciones del feed RSS que WordPress genera por defecto, excluyéndola de la consulta principal.

Para ello podemos incluir esta función en el archivo functions.php, especificando el ID de la categoría que vamos a eliminar:

// ---------------------------------------------------
// Excluimos la categoria "Privado" del feed RSS
// ---------------------------------------------------
function new_filter_feed($query) {
    if ( $query->is_feed ) {
        $query->set( 'cat', '-25' ); // Si son varias: ( 'cat', '-25, -30, -35' );
    }
	return $query;
}
add_filter( 'pre_get_posts','new_filter_feed' );

Conclusión

Posiblemente las futuras versiones de WordPress incluyan la opción de proteger categorías con contraseña y no haya que seguir todo este proceso para conseguirlo, aunque la verdad es que es poco probable, porque esto añadiría complejidad al sistema y tal vez no sea una de las funciones más demandadas.

Lo que es seguro es que, si montas webs para clientes, en algún momento te van a pedir que consigas ampliar las funciones de WordPress para que el contenido sea un poco menos público.

Comentarios

  1. 360Apps

    Gracias :) Justo lo que buscaba para una sección de mi blog.

  2. Aptoide

    Por fin lo encontré, gracias por compartirlo, desde hoy seré seguidor de esta web :) Muchas gracias

  3. María

    Hola, Daniel
    Muchas gracias por tu tiempo y por hacernos más sencilla la gestión de nuestras webs.
    Me interesa mucho este artículo pero me gustaría saber si hay alguna manera de permitir el acceso a una categoría concreta a un grupo específico de suscriptores.
    Me explico mejor. Necesito crear grupos de suscriptores diferenciados, por ejemplo: “altos”, “rubios”, “franceses” y, dependiendo del grupo al que pertenezcan, darles acceso a un tipo de contenido. Mis dudas son: ¿cómo creo esos grupos? ¿cómo les doy acceso a esos contenidos de manera que cada uno acceda con su propia contraseña y no necesite una común a todos? Preferiría evitar modificar los archivos del tema por defecto, porque soy muy torpe y seguro que algo haría mal (¡no tengo ni idea de programación!). He instalado el pluggin Register Plus y me ayuda bastante a la hora de crear el formulario de registro y discriminar a los suscriptores por grupos.

    Muchísimas gracias por adelantado

  4. Daniel

    Hola María.
    En ese caso, lo suyo sería utilizar un plugin como Members, que te permite gestionar mejor los usuarios, roles y contenido, así después puedes agrupar a los usuarios según su rol y permitir o denegar el acceso a partes de la web (aunque para esto tal vez se necesario editar algunos archivos del tema):
    https://wordpress.org/plugins/members/

  5. Flamenco

    Muchas gracias, es lo que buscaba, lo voy a probar.

  6. Hola Buen día, tenemos una página web que da acceso a nuestros clientes a nuestra información, cada cliente tiene un usuario y contraseña especifico donde se cargan sus documentos privados, de tal manera que solo el lo puede ver, no obstante en la empresa se manejan documentos generales que son muy pesados, los cuales decidimos ponerlos publicos, para que cualquiera de los clientes lo pudiera ver y evitar cargarlos 50 veces, no obstante esta información si ponemos en cualquier buscador de crome el nombre de algún archivo lo abre directamente, sin necesidad de usuario y contraseña, lo que necesito que me ayuden es a saber si hay alguna opcion donde yo pueda agregar que este contenido general sea privado para todos los 50 clientes si tener que cargarlo para cada uno, para evitar que cualquiera pueda descargar la informacion tenga usuario y contraseña o no.

    Gracias por el apoyo, espero me puedan ayudar

  7. Andres

    Muy interesante, gracias.

  8. Renzo

    Hola Daniel.
    Mi sitio ya tenia el de pasword. Le sumo la nueva clave al existente?
    Y me arroja error.

    Y coloco el codigo que nos das antes o despues de:
    # END WordPress ?
    y de:
    AuthUserFile /var/www/vhosts/midominio.com/httpdocs/.htpasswd
    Solo cambio donde va midominio?
    Gracias

  9. Muy buen artículo. He probado la protección y funciona perfectamente. Gracias.

  10. Santiago

    Hola Daniel muy buen articulo.
    No se si es muy complicado para lo que yo necesito.

    Solo quiero proteger una pagina con usuario y contraseña. Es una web de una tienda de decoración y quieren hacer una sección que sea lista de boda (de una boda en concreto) y que cuando des te pida usuario y contraseña. Los introduces y accedes a la pagina donde se muestran los artículos de la lista de boda.

    Igual hay algo mas fácil para hacer eso, no?

  11. Daniel

    Hola Santiago.
    Sí, la opción más sencilla es proteger una página o entrada con contraseña con la funcionalidad que viene con WordPress por defecto. Aquí tienes más información: http://www.danielnabil.com/blog/wordpress-proteger-contrasena-paginas-entradas/

Y tú qué opinas?

Las URLs se convertirán en enlaces automáticamente. Tu dirección de email no se publicará ni se utilizará para enviar ningún tipo de información. Los mensajes que no aporten nada al tema que se trata en esta entrada se borrarán. Las imágenes que aparecen al lado de cada autor utilizan el servicio de Gravatar. Recuerda que puedes usar etiquetas HTML como <a href>, <code>, <em> o <strong> en los comentarios.

(necesario)

(opcional)