【问题标题】:Can't check if a role is granted无法检查是否授予角色
【发布时间】:2017-09-08 05:02:51
【问题描述】:

我必须在用户登录时为他设置动态角色,所以我创建了一个服务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,但如果他在登录时检查此角色,则会添加该角色。基本上,用户有一个角色每节课

【问题讨论】:

  • 可以显示addRole功能码吗?
  • @i.am.michiel addRole 函数由 FOSUserBundle 提供
  • 角色是否保留?在每次请求时,FOSUserBundle 都会从数据库(或任何您的提供者)中重新加载用户和角色。
  • 仅作为测试,如果用户注销然后重新登录系统,会出现消息(检查正常)?
  • @i.am.michiel 是的,我在登录时检查了我的数据库,并且该角色保持不变

标签: php symfony twig user-roles


【解决方案1】:

我找到的解决方案是创建自己的函数来检查用户是否具有特定角色:

public function isGranted($role)
{
    return in_array($role, $this->getRoles());
}

现在我可以使用{% if app.user.isGranted("ROLE_FLEX") %}

【讨论】:

  • 请注意,当您执行此操作时,您正在绕过安全系统。如果您决定使用选民之类的东西,那么您将遇到麻烦。
  • @Cerad 我暂时没有找到其他解决方案,因为我在用户注销时删除了角色
【解决方案2】:

当您将角色传递给is_granted() 函数时,Symfony 安全层使用的RoleVoter 类从令牌而不是用户对象中读取角色。这意味着您也必须相应地更新令牌。

【讨论】:

  • 谢谢,这解决了我的问题!我用this问题刷新了令牌
猜你喜欢
  • 2021-12-07
  • 2014-07-27
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 2019-05-21
  • 2019-05-16
  • 2020-12-07
相关资源
最近更新 更多