Я хотел бы иметь возможность проверить, предоставлены ли атрибуты (роли )любому произвольному объекту, реализующему UserInterface
в Symfony2. Это возможно?
UserInterface->getRoles()
не подходит для моих нужд, потому что не учитывает иерархию ролей, и я не хотел бы изобретать велосипед в этом отделе, поэтому я хотел бы использовать Access Decision Manager, если это возможно.
Спасибо.
В ответ на решение Оливье ниже, вот мой опыт:
You can use the security.context service with the isGranted method. You can pass a second argument which is your object.
$user = new Core\Model\User();
var_dump($user->getRoles(), $this->get('security.context')->isGranted('ROLE_ADMIN', $user));
Выход:
array (size=1)
0 => string 'ROLE_USER' (length=9)
boolean true
Моя иерархия ролей:
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: ~
Мой UserInterface->getRoles()
метод:
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
должно быть назначено явно, однако isGranted('ROLE_ADMIN', $user)
возвращает TRUE
, даже если пользователь был только что создан и ему не были назначены какие-либо роли, кроме ролей по умолчанию ROLE_USER
, , до тех пор, пока пользователю, вошедшему в систему, предоставленоROLE_ADMIN
. Это наводит меня на мысль, что второй аргумент isGranted()
просто игнорируется и вместо него используется Token
, предоставленный AccessDecisionManager->decide()
с помощью SecurityContext
.
Если это ошибка, я отправлю отчет, но, может быть, я все еще делаю что-то не так?