无法检查角色是否被授予
Can't check if a role is granted
我必须在用户登录时为他设置动态角色,所以我创建了一个服务 LoginSuccessHanlder
并在登录成功时使用此功能:
public function onAuthenticationSuccess(Request $request, TokenInterface $token) {
$response = null;
$user = $this->token->getToken()->getUser();
$poste = $request->get('_poste');
$user->addRole('ROLE_'.strtoupper($poste));
$this->em->persist($user);
$this->em->flush();
if ($this->authorizationChecker->isGranted('ROLE_USER')) {
$response = new RedirectResponse($this->router->generate('homepage'));
$response->headers->setCookie(new Cookie('poste', $poste));
}
return $response;
}
所以在这里,由于登录表单中的一个字段,我为用户添加了一个新角色 _poste
.登录后,我应该可以执行以下操作:
{% if is_granted("ROLE_FLEX") %}
message
{% endif %}
但是没有消息
但是如果我这样做:
{{ dump(app.user.roles) }}
我在数组中有角色 ROLE_FLEX
,为什么我不能用 is_granted
函数检查角色?我错过了什么?
有关信息,我正在使用 FOSUserBundle
编辑
每次用户注销时我都会删除该角色,因此当用户注销时他不再拥有 ROLE_FLEX
但如果他在登录时检查此角色,则会添加该角色。基本上是用户每个会话都有一个角色
我找到的解决方案是创建自己的函数来检查用户是否具有特定角色:
public function isGranted($role)
{
return in_array($role, $this->getRoles());
}
现在我可以使用{% if app.user.isGranted("ROLE_FLEX") %}
当您将角色传递给 is_granted()
函数时,Symfony 安全层使用的 RoleVoter
class 从令牌而非用户对象中读取角色。这意味着您也必须相应地更新令牌。
我必须在用户登录时为他设置动态角色,所以我创建了一个服务 LoginSuccessHanlder
并在登录成功时使用此功能:
public function onAuthenticationSuccess(Request $request, TokenInterface $token) {
$response = null;
$user = $this->token->getToken()->getUser();
$poste = $request->get('_poste');
$user->addRole('ROLE_'.strtoupper($poste));
$this->em->persist($user);
$this->em->flush();
if ($this->authorizationChecker->isGranted('ROLE_USER')) {
$response = new RedirectResponse($this->router->generate('homepage'));
$response->headers->setCookie(new Cookie('poste', $poste));
}
return $response;
}
所以在这里,由于登录表单中的一个字段,我为用户添加了一个新角色 _poste
.登录后,我应该可以执行以下操作:
{% if is_granted("ROLE_FLEX") %}
message
{% endif %}
但是没有消息
但是如果我这样做:
{{ dump(app.user.roles) }}
我在数组中有角色 ROLE_FLEX
,为什么我不能用 is_granted
函数检查角色?我错过了什么?
有关信息,我正在使用 FOSUserBundle
编辑
每次用户注销时我都会删除该角色,因此当用户注销时他不再拥有 ROLE_FLEX
但如果他在登录时检查此角色,则会添加该角色。基本上是用户每个会话都有一个角色
我找到的解决方案是创建自己的函数来检查用户是否具有特定角色:
public function isGranted($role)
{
return in_array($role, $this->getRoles());
}
现在我可以使用{% if app.user.isGranted("ROLE_FLEX") %}
当您将角色传递给 is_granted()
函数时,Symfony 安全层使用的 RoleVoter
class 从令牌而非用户对象中读取角色。这意味着您也必须相应地更新令牌。