En Symfony2, la acción de inicio de sesión me muestra como desconectado cuando en realidad estoy conectado
Frecuentes
Visto 1,701 veces
1
Si un usuario que ha iniciado sesión va a la acción de inicio de sesión, quiero redirigirlo a otra página. Pero no puedo averiguar cómo detectar si el usuario ha iniciado sesión o no mientras está dentro del loginAction
método. El contexto de seguridad en la acción de inicio de sesión hace que parezca que estoy desconectado cuando no lo estoy.
Como prueba, estoy solicitando las dos páginas siguientes mientras estoy conectado al sitio. ¿Por qué no puedo obtener acceso al usuario en la acción de inicio de sesión?
Aquí está mi acción de inicio de sesión:
public function loginAction()
{
$token = $this->get('security.context')->getToken();
print_r(get_class($token));
// Outputs "Symfony\Component\Security\Core\Authentication\Token\AnonymousToken"
print_r($token->getUser());
// Outputs "anon."
}
Aquí hay una acción genérica en la aplicación, protegida por el inicio de sesión:
public function regularAction()
{
$token = $this->get('security.context')->getToken();
print_r(get_class($token));
// Outputs "Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken"
print_r(get_class($token->getUser()));
// Outputs "Company\BaseBundle\Entity\User"
}
Aquí está mi security.yml
:
security:
encoders:
Company\BaseBundle\Entity\User:
algorithm: sha1
iterations: 1
encode_as_base64: false
providers:
main:
entity: { class: Company\BaseBundle\Entity\User, property: user_name }
firewalls:
login_firewall:
pattern: ^/login$
anonymous: ~
main:
pattern: ^/
form_login:
login_path: /login
check_path: /login_check
post_only: true
always_use_default_target_path: false
default_target_path: /
use_referer: true
failure_path: null
failure_forward: false
username_parameter: user_name
password_parameter: password_hash
csrf_parameter: _csrf_token
intention: authenticate
logout:
path: /logout
target: /
acl:
connection: default
EDITAR: no pensé que el resto de mis firewalls fueran pertinentes, pero después de leer la respuesta de ilanco, creo que podrían ser
security:
encoders:
Company\BaseBundle\Entity\User:
algorithm: sha1
iterations: 1
encode_as_base64: false
providers:
main:
entity: { class: Company\BaseBundle\Entity\User, property: user_name }
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login_firewall:
pattern: ^/login$
anonymous: ~
password_reset:
pattern: ^/passwordreset/*$
anonymous: ~
error_firewall:
pattern: ^/error/.*$
anonymous: ~
unsupported_broswers:
pattern: ^/unsupported$
anonymous: ~
security_question_firewall:
pattern: ^/user/(locked|security_question)/(new)*$
anonymous: ~
api_firewall:
pattern: ^/api/.*$
provider: main
http_basic:
realm: "Secured API Area. Login with your regular credentials"
provider: main
main:
pattern: ^/
form_login:
login_path: /login
check_path: /login_check
post_only: true
always_use_default_target_path: false
default_target_path: /
use_referer: true
failure_path: null
failure_forward: false
username_parameter: user_name
password_parameter: password_hash
csrf_parameter: _csrf_token
intention: authenticate
logout:
path: /logout
target: /
acl:
connection: default
Siguiendo la sugerencia de ilanco, eliminé esto:
login_firewall:
pattern: ^/login$
anonymous: ~
y agregó esto directamente debajo del providers
sección:
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
Pero luego tuve un error de bucle de redirección cuando accedí a /login.
2 Respuestas
1
He luchado con este problema también.
/login
no forma parte del cortafuegos principal, por lo que no se puede acceder al usuario allí.
La forma de resolver esto es eliminar el firewall personalizado al que ha llamado login_firewall
y permitir el acceso a /login
a través de LCA.
Agregue el siguiente código a su security.yml
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
contestado el 22 de mayo de 12 a las 19:05
0
Se las arregló para resolver este problema: el problema con el bucle de redirección se debe a la falta de acceso a la página de inicio de sesión. Creé solo un firewall, configuré el acceso para anónimo: ~, definí access_control para no usuarios y ¡listo!
security:
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: true
anonymous: ~
secured_area:
pattern: ^/
anonymous: ~
form_login:
login_path: /login
check_path: /login_check
always_use_default_target_path: true
default_target_path: /
logout:
path: /logout
target: /
providers:
main:
entity: { class: Core\UserBundle\Entity\User, property: username }
encoders:
Core\UserBundle\Entity\User:
algorithm: sha256
iterations: 10
encode_as_base64: true
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, roles: ROLE_SUPERADMIN }
- { path: ^/user, roles: ROLE_USER }
- { path: ^/, roles: IS_AUTHENTICATED_FULLY }
Respondido el 13 de junio de 12 a las 09:06
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas security symfony login or haz tu propia pregunta.
En respuesta a su respuesta, edité la publicación original. ¿Podrías mirarlo por favor? - mattalxndr
poner
access_control:
bajo el Tema G: Cómo recibir pagos por adelantado del crédito tributario por hijossecurity:
no,providers:
- ilanco