Hola Javier, tengo un problema, sucede que estoy implementando al seguridad de mi sistema y ya tengo definida la jerarquía de toles, el proveedor, el firewall y los access_control, pero de la manera que lo estoy haciendo es posible inyectar la url y entrar a ella, obviamente esto es una falla de seguridad si sucede así y la realidad es que no se que tengo mal en el security.yml o que me falta, aquí te lo dejo y más abajo te explico que estoy haciendo y basado en lo que está, que hace el:
security: encoders: Comun\UsuarioBundle\Entity\Usuario: bcrypt role_hierarchy: ROLE_LIMITADO: ROLE_USUARIO ROLE_TECNICO: [ROLE_LIMITADO] ROLE_TRABAJADOR: [ROLE_LIMITADO] ROLE_AVANZADOLAB: [ROLE_TECNICO] ROLE_AVANZADOADMIN: [ROLE_TRABAJADOR] ROLE_ADMINISTRADOR: [ROLE_AVANZADOLAB, ROLE_AVANZADOADMIN, ROLE_ALLOWED_TO_SWITCH ] providers: ldap: id: ztec.security.active.directory.user.provider firewalls: ldap: provider: ldap pattern: ^/ anonymous: ~ active_directory: login_path: login check_path: login_check default_target_path: dashboard always_use_default_target_path: true logout: path: logout target: login remember_me: key: mi_clave_no_es_esta lifetime: 900 dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false access_control: - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: http } - { path: ^/, roles: ROLE_USUARIO } - { path: ^/af, roles: ROLE_ADMINISTRADOR }
Decirte además que mi Comun\UsuarioBundle\Entity\Usuario
es hijo de la clase user.provider
del bundle al que puntea en el provider.ldap.id
.
De esta manera cuando logueo a un usuario con rol ROLE_TRABAJADOR
me puede inyectar la URL poniendo /af
y entra y no debería ser.
¿Qué ves mal?
Respuestas
El problema creo que está en el orden en el que has definido las reglas de la sección access_control
:
security: # ... access_control: - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: http } - { path: ^/, roles: ROLE_USUARIO } - { path: ^/af, roles: ROLE_ADMINISTRADOR }
Ten en cuenta que Symfony las comprueba por orden desde la primera hasta la última. Así que tu configuración se interpreta así:
- Si la URL empieza por
/login
, puede entrar todo el mundo - Si la URL es cualquiera, puede entrar cualquier usuario con el rol
ROLE_USUARIO
- Si la URL empieza por
/af
, solo pueden entrar los administradores
Lo que tienes que hacer es poner las reglas más restrictivas primero y después las más genéricas:
security: # ... access_control: - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: http } - { path: ^/af, roles: ROLE_ADMINISTRADOR } - { path: ^/, roles: ROLE_USUARIO }
@javiereguiluz