2011-05-13 17 views
12

que uso estándar de Symfony 2.0.0BETA1 y trató de configurar la autenticación http_basic exactamente el mismo que en this book chapterSymfony2 http_basic de seguridad rechaza las credenciales válidas

security: 
encoders: 
    Symfony\Component\Security\Core\User\User: plaintext 

providers: 
    main: 
     users: 
      foo: { password: testing, roles: ROLE_USER } 

firewalls: 
    main: 
     pattern: /.* 
     http_basic: true 
     logout:  true 

access_control: 
    - { path: /.*, role: ROLE_USER } 

El problema es que cuando intento abrir una página y me someto nombre de usuario " prueba "foo" y contraseña "simplemente hace un bucle y me pide credencial infinitamente o muestra la página de error.

Pasos para reproducir problema:

  1. configuración de seguridad de copia de http://symfony.com/doc/current/book/security/overview.html#configuration y pasado a security.yml archivo
  2. actualización de aplicaciones en la página de inicio
  3. Introduzca las credenciales válidas

comportamiento esperado es para ver la página de inicio, pero en su lugar aparece el mensaje de credenciales.

¿Alguien sabe por qué sucede eso y cómo solucionarlo?

Respuesta

7

El HTTP se rompe con PHP como CGI/FastCGI bajo Apache

Hay una solución:

app_dev.php

if(!isset($_SERVER['PHP_AUTH_USER'])) 
{ 
    if (isset($_SERVER['HTTP_AUTHORIZATION']) && (strlen($_SERVER['HTTP_AUTHORIZATION']) > 0)) 
    { 
     list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6))); 
     if(strlen($_SERVER['PHP_AUTH_USER']) == 0 || strlen($_SERVER['PHP_AUTH_PW']) == 0) 
     { 
      unset($_SERVER['PHP_AUTH_USER']); 
      unset($_SERVER['PHP_AUTH_PW']); 
     } 
    } 
} 

web/.htaccess

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ app.php [QSA,L] 
</IfModule> 

Fuente: symfony github issue

7

El problema es que tiene acceso restringido a /.*, lo que significa que todas las rutas de acceso son solo para usuarios que tienen el rol ROLE_USER.

Supongamos que su ruta de acceso es /login, el usuario intenta acceder a cualquier otra ruta y se le redirige a la ruta de inicio de sesión. La ruta de inicio de sesión (/login) coincidirá con el patrón de control de acceso /.*. Luego, se denegará el acceso al usuario porque no tiene el rol ROLE_USER en este momento. El componente de seguridad redirigirá al usuario de nuevo al formulario de inicio de sesión para que pueda autenticarse y obtener el rol, que está restringido, y redirigirá al usuario al formulario de inicio de sesión para autenticarse, y así sucesivamente.

Aquí hay una solución simple para evitar este problema. Puede permitir el acceso al formulario de inicio de sesión a un usuario anónimo con la activación de la configuración de usuario anónimo y un nuevo elemento de control de acceso. Añadir esto a continuación main en la configuración firewalls para permitir usuario anónimo:

security: 
    firewalls: 
     main: 
      anonymous: true 

y añadir un nuevo elemento de control de acceso para permitir que el usuario anónimo para acces el patrón /login:

access_control: 
    - { path: /login, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: /.*, role: ROLE_USER } 

El orden es importante aquí, ya la regla es: el primer camino coincide con victorias. Por lo tanto, la ruta /login debe estar por encima de su patrón para otra ruta /.*. Esto debería resolver redirigir el bucle.

La documentación de Symfony sobre seguridad se está reescribiendo ahora y se hablará más en detalle sobre este problema. Está en el repositorio de symfony-docs github bajo la rama security.

Saludos, Matt autenticación básica

+0

OK, entiendo tu punto, pero estoy tratando de usar HTTP básico, por lo que no hay formularios de inicio de sesión personalizados, el navegador debería automáticamente mostrar el formulario de credenciales (o, de manera estándar, podría acceder a mi aplicación simplemente configurando encabezados apropiados, algo como 'Autorización: QWxhZGRpbjpvcGVuIHNlc2FtZQ ==' básico) – sbgoran

+0

+1 esto me estaba volviendo loco, estoy usando 2.1, los documentos no dicen nada sobre esto. –

0

yo uso mi ruta boundle:

- { path: /correspondencia/recepcion/login, role: IS_AUTHENTICATED_ANONYMOUSLY } 
- { path: /correspondencia/recepcion, role: ROLE_ADMIN } 

sin las t slash mal

/correspondencia/recepcion/ 

buena

/correspondencia/recepcion 
6

El mismo problema se sigue produciendo en la versión actual (versión 2.1.8 de Symfony).

Es por la forma especial en que Apache + PHP como FastCGI maneja las variables de autenticación de HTTP.

Al menos, el punto de referencia para la versión actual es un poco más simple de lo que era antes (en comparación con la respuesta de @ Teo.sk), y las instrucciones están disponibles codificado directamente como comentarios en el archivo vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/ServerBag.php del marco:

/* 
* php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default 
* For this workaround to work, add these lines to your .htaccess file: 
* RewriteCond %{HTTP:Authorization} ^(.+)$ 
* RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 
* 
* A sample .htaccess file: 
* RewriteEngine On 
* RewriteCond %{HTTP:Authorization} ^(.+)$ 
* RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 
* RewriteCond %{REQUEST_FILENAME} !-f 
* RewriteRule ^(.*)$ app.php [QSA,L] 
*/ 

En resumen, para solucionarlo, todo lo que tiene que hacer es añadir las siguientes líneas al archivo de la carpeta .htaccessweb/ de su aplicación:

RewriteCond %{HTTP:Authorization} ^(.+)$ 
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 

Nueva información (01/05/2013): Ahora estoy usando Symfony versión 2.2.1 y con el arreglo de trabajar he tenido que añadir estas dos líneas de código justo debajo de la siguiente línea de web/.htaccess:

RewriteEngine On 
+1

Esto es exactamente lo que solucionó mi problema. Ya encontré el RewriteRule en otro lugar en stackoverflow, pero solo funcionó después de agregar el RewriteCond. ¡Gracias! – AaL

+0

la solución más corta y más actualizada aquí. – vaxquis

0

no necesita modificar su SymfonyProject, también necesita cambiar la configuración de apache2.

sudoedit/etc/apache2/sites-enabled/[su sitio] .conf

inserción

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ app.php [QSA,L] 

torreón para reiniciar apache2

disfrutar :)

Cuestiones relacionadas