Me gustaría poder verificar si los atributos (roles) se otorgan o no a cualquier objeto arbitrario que implemente UserInterface
en Symfony2. es posible?¿Cómo se usa AccessDecisionManager en Symfony2 para la autorización de usuarios arbitrarios?
UserInterface->getRoles()
no es adecuado para mis necesidades porque no tiene en cuenta la jerarquía de roles, y prefiero no reinventar la rueda en ese departamento, por lo que me gustaría usar Access Decision Manager si es posible .
Gracias.
En respuesta a la solución de Olivier continuación, aquí es mi experiencia:
Usted puede utilizar el servicio security.context con el método isGranted. Puede pasar un segundo argumento que es su objeto.
$user = new Core\Model\User();
var_dump($user->getRoles(), $this->get('security.context')->isGranted('ROLE_ADMIN', $user));
Salida:
array (size=1)
0 => string 'ROLE_USER' (length=9)
boolean true
Mi jerarquía de roles:
role_hierarchy:
ROLE_USER: ~
ROLE_VERIFIED_USER: [ROLE_USER]
ROLE_ADMIN: [ROLE_VERIFIED_USER]
ROLE_SUPERADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
ROLE_ALLOWED_TO_SWITCH: ~
Mi UserInterface->getRoles()
método:
public function getRoles()
{
$roles = [$this->isVerified() ? 'ROLE_VERIFIED_USER' : 'ROLE_USER'];
/**
* @var UserSecurityRole $userSecurityRole
*/
foreach ($this->getUserSecurityRoles() as $userSecurityRole) {
$roles[] = $userSecurityRole->getRole();
}
return $roles;
}
ROLE_ADMIN
debe asignarse de forma explícita, sin embargo isGranted('ROLE_ADMIN', $user)
vuelve TRUE
incluso si el usuario se acaba de crear y no se ha asignado ninguna función distinta de la predeterminada ROLE_USER
, siempre y cuando el usuario actualmente conectado se concede ROLE_ADMIN
. Esto me lleva a creer que el segundo argumento para isGranted()
se ignora y que el Token
proporcionado a AccessDecisionManager->decide()
por el SecurityContext
se usa en su lugar.
Si esto es un error, enviaré un informe, pero ¿tal vez sigo haciendo algo mal?
Obteniendo el error dentro de '$ grantedRole-> getRole()' en Symfony 2.3 –