【发布时间】:2016-04-19 23:40:28
【问题描述】:
在我的用户使用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 类实现了EquatableInterface 类并在其中创建了一个isEqualTo 函数来重新加载我的用户数据,同时我无需任何注销即可更改它。
public function isEqualTo(UserInterface $user)
{
return false;
}
但是当我的监听器重定向到达时,我在一个没有分析器的白页中得到了一个Access Denied。
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 }
我已经尝试在类中设置角色(在代码中不是动态的),它可以工作,所以我的防火墙似乎工作除了动态设置数据,即使我重新加载用户。
你知道那里出了什么问题吗?
【问题讨论】:
-
重定向后您的角色将丢失。确保将其保存在数据库中。
-
为什么要给用户添加角色,然后在令牌上调用
getRoles()? -
@xabbuh 因为他想看看角色是否正确设置给了用户。
-
你用的是什么版本的 symfony?
-
@Valdas 我在这个项目中没有使用数据库,我使用 API(另一个项目)获取我的用户数据,我只是希望角色在这个项目中是本地的。您的意思是我的用户数据会为每个操作重新加载吗? ://
标签: php symfony firewall roles access-control