Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Bug Symfony2 isgrated(';我的角色';)返回true,但防火墙返回403_Php_Symfony_Firewall_Roles_Access Control - Fatal编程技术网

Php Bug Symfony2 isgrated(';我的角色';)返回true,但防火墙返回403

Php Bug Symfony2 isgrated(';我的角色';)返回true,但防火墙返回403,php,symfony,firewall,roles,access-control,Php,Symfony,Firewall,Roles,Access Control,在我的用户使用AuthenticationSuccessHandlerInterface侦听器登录后,我正在动态地向他添加一个角色 public function onAuthenticationSuccess(Request $request, TokenInterface $token) { $user = $this->security->getToken()->getUser(); $user->addRole('MY_ROLE'); v

在我的用户使用
AuthenticationSuccessHandlerInterface
侦听器登录后,我正在动态地向他添加一个角色

public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
    $user = $this->security->getToken()->getUser();
    $user->addRole('MY_ROLE');

    var_dump($this->security->isGranted('MY_ROLE'));
    var_dump($this->security->getToken()->getRoles()); die;

    return new RedirectResponse('...');
}
两个var_dump()都显示
$user
获得了新的权限。 我制作了
User
类实现了
equalInterface
类,并在其中制作了一个
isEqualTo
函数,以便在更改用户数据时重新加载数据,而无需任何注销

public function isEqualTo(UserInterface $user)
{
    return false;
}
但是当我的侦听器重定向到达时,我在一个没有分析器的白色页面中获得了一个
访问被拒绝的

access_control:
    - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/login/check$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, roles: MY_ROLE }
我已经尝试在类中设置角色(在代码中不是动态的),它可以工作,所以防火墙似乎可以工作,除了动态设置的数据,即使我重新加载用户


你知道那里出了什么问题吗?

你可以尝试在你的应用程序/security.yml中添加以下内容:

security:
    always_authenticate_before_granting: true

您可以尝试将其添加到您的应用程序/security.yml中:

security:
    always_authenticate_before_granting: true

最后,我使用一个带有
安全性.interactive\u login
内核.request
事件的事件侦听器绕过了这个问题

我在会话中(在为
security.interactive\u login
事件注册的操作中)设置一个键,并签入
内核。如果该键设置为做一件事或另一件事,则请求
事件(捕获对网站的每次调用)


希望这能帮助一些人…

我最终绕过了这个问题,使用了一个带有
安全性、交互式登录
内核、请求
事件的事件侦听器

我在会话中(在为
security.interactive\u login
事件注册的操作中)设置一个键,并签入
内核。如果该键设置为做一件事或另一件事,则请求
事件(捕获对网站的每次调用)


希望这可以帮助某人…

在您的角色丢失后重定向。确保将其保存在数据库中。为什么要将角色添加到用户中,然后在令牌上调用
getRoles()
?@xabbuh,因为他想查看角色是否正确设置为用户。您使用的symfony版本是什么?@Valdas我在这个项目中不使用数据库,我使用API(另一个项目)获取用户数据我只希望这个角色是这个项目的本地角色。你是说每次操作都会重新加载我的用户数据吗/重定向后,您的角色将丢失。确保将其保存在数据库中。为什么要将角色添加到用户中,然后在令牌上调用
getRoles()
?@xabbuh,因为他想查看角色是否正确设置为用户。您使用的symfony版本是什么?@Valdas我在这个项目中不使用数据库,我使用API(另一个项目)获取用户数据我只希望这个角色是这个项目的本地角色。你是说每次操作都会重新加载我的用户数据吗/我忘了说我已经在我的app/security.yml中添加了这个。无论如何,谢谢你的回答=)我忘了说我已经在我的app/security.yml中添加了这个。无论如何,谢谢你的回答=)