Solución de autenticación PHP y .htaccess

Aquí está el diseño:

web root - admin (dir) - index.php - js - img - other files / dirs - dir - files 

Hasta ahora, he protegido el directorio admin con .htaccess passwd porque quiero un control de acceso completo para todos los archivos en ese directorio (incluidos los scripts js, jpg, pdf, etc.). Por otro lado, mi CMS personalizado proporciona autenticación mediante PHP sesssion / cookie para otras URL. Lo que quiero lograr es usar la misma autenticación de PHP para el directorio protegido con .htaccess, evitando el mensaje emergente de usuario / contraseña para los usuarios ya autenticados de PHP. En resumen:

  • Quiero que el directorio de administración use las reglas .htaccess para la autenticación
  • Si un usuario ya está autenticado mediante PHP (inicie sesión en un formulario HTML, en un archivo no protegido), omita el segundo proceso de autenticación .htaccess cuando acceda al contenido del directorio de administración.
  • Si un usuario no autenticado con PHP intenta acceder al contenido en el directorio de administración, se debe activar la ventana emergente de autenticación HTTP

La mayoría de las cosas que he leído sugieren que mueva el directorio de administración fuera de la raíz web y acceda a los archivos desde un script PHP con un archivo de lectura, que no quiero hacer. Hay contenido dynamic en ese directorio, así como estático. Sé que apache activará la ventana emergente de autenticación antes de cargar cualquier recurso, por lo que la pregunta es cómo hacer que apache sea consciente de que el usuario ya está autenticado. ¿Alguna otra sugerencia / solución?

Puede usar la variable SetEnvIf en el archivo .htaccess para verificar si un determinado valor de Cookie está establecido. Por ejemplo (esto no es muy seguro, pero solo para ilustración):

 AuthType Basic AuthName "Protected Login" AuthUserFile "/path/to/.htpasswd" AuthGroupFile "/dev/null" SetEnvIf Cookie PHPSESSID=.* PASS=1 Order deny,allow Deny from all Allow from env=PASS Require valid-user Satisfy any 

La línea SetEnvIf Cookie PHPSESSID=.* PASS=1 comprueba si una Cookie está configurada con un ID de sesión de PHP y si es así, eso es suficiente para Satisfy el proceso de autenticación y el Allow from env=PASS hace que se omita el aviso de inicio de sesión si esto es cierto.

Nuevamente, este ejemplo no es muy seguro, ya que una cookie de sesión de PHP ya está establecida cuando se llama a session_start() sin un bash de autenticación exitoso, por lo que sería mejor establecer un valor de cookie más críptico / aleatorio que sea difícil de adivinar. Por ejemplo:

 SetEnvIf Cookie AJNC3Z921dmc4O8P2 PASS=1 

De esa manera, si establece un valor de cookie de AJNC3Z921dmc4O8P2 tras una autenticación exitosa a través de PHP, esto será suficiente para pasar el proceso de autenticación. Asegúrese de establecer un tiempo de caducidad de cookie adecuado para evitar que las personas puedan pasar el aviso de inicio de sesión durante un período prolongado.