Как использовать AccessDecisionManager в Symfony2 для авторизации произвольных пользователей?

Я хотел бы иметь возможность проверить, предоставлены ли атрибуты (роли )любому произвольному объекту, реализующему 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.

Если это ошибка, я отправлю отчет, но, может быть, я все еще делаю что-то не так?

12
задан j0k 20 September 2012 в 19:52
поделиться