UserInterface
Symfony2 で実装されている任意のオブジェクトに属性 (ロール) が付与されているかどうかを検証できるようにしたいと考えています。これは可能ですか?
UserInterface->getRoles()
ロール階層が考慮されていないため、私のニーズには適していません。また、その部門で車輪を再発明したくないため、可能であれば Access Decision Manager を使用したいと考えています。
ありがとう。
以下のオリヴィエの解決策に応えて、ここに私の経験があります:
isGranted メソッドで security.context サービスを使用できます。オブジェクトである 2 番目の引数を渡すことができます。
$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)
れます。これにより、 の 2 番目の引数が単に無視され、によって提供されたが代わりに使用されると思われます。TRUE
ROLE_USER
ROLE_ADMIN
isGranted()
Token
AccessDecisionManager->decide()
SecurityContext
これがバグである場合はレポートを送信しますが、まだ何か間違っているのでしょうか?