gpt4 book ai didi

symfony - symfony 如何监听 _switch_user?

转载 作者:行者123 更新时间:2023-12-03 01:25:04 25 4
gpt4 key购买 nike

我有一个应用程序,其中有 super 管理员角色和具有不同权限的各种用户角色。我希望能够使用 _switch_user 查询来模拟这些用户,如 http://symfony.com/doc/current/book/security.html#impersonating-a-user 所示。

但是,当我将查询添加到网址末尾时,它似乎没有执行任何操作。我已经玩了很长时间了,似乎找不到解决方案。我知道我登录的用户有 ROLE_ALLOWED_TO_SWITCH,但我似乎不太明白 symfony 是如何做到这一点的。

我正在使用自定义身份验证提供程序,因此我认为它与此有关,但我不确定我需要查看什么。我可以发布所需的任何代码,但我真的不知道现在要发布什么。

最佳答案

因此,我进行了更多研究,发现我的自定义身份验证提供程序的 Listener 类编写不正确。它的编写方式是在每次页面加载时创建一个新的Token

因此需要完成两件事。

第一个是将身份验证监听器更改为与 Symfony Firewall Listeners 中的类似。 ,其总体结构如下所示。

if (null !== $token = $this->securityContext->getToken()) {
if ($token instanceof UsernamePasswordToken && $token->isAuthenticated() &&
$token->getUsername() === $username) {
return;
}
}

如果满足某些条件,这些监听器基本上允许身份验证继续进行,而无需创建新 token 。这些条件是 token 是正确 token 的实例、经过身份验证并且用户名与登录用户的用户名匹配。

其次,如果他尝试切换用户,则必须修改此代码以根据原始用户检查身份验证。 This issue详细说明了其他人遇到的类似问题。修复方法是循环遍历角色以查找 SwitchUserRole 并使用该数据进行身份验证。我已经复制了下面的补丁,该补丁位于上面的初始 if 语句之后。

foreach ($token->getRoles() as $role) {
if ($role instanceof SwitchUserRole) {
$token = $role->getSource();
break;
}
}

总的来说,身份验证监听器仅在未通过某些条件的情况下才会创建新 token ,并且模拟另一个用户的凭据将用于测试身份验证,而不是他们尝试模拟的用户的凭据。

关于symfony - symfony 如何监听 _switch_user?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12167550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com