有的时候,会因为某种原因,需要变换用户的角色,并实时生效。例如,用户因某些行为(变为高级会员),提高了自己的权限,程序配给它一个新的角色,这就需要程序立即更新这个用户,让用户立刻享有自己的职能。
或者有些会员违反了,网站的规定,网站及时将其降权,防止此会员的恶意行为。这都需要角色变换后的及时更新,也就是对用户的重新加载。
在User Entity下手
很简单,只需要用到EquatableInterface接口,在这个接口中有一个函数isEqualTo,我们实现了它就可以了:
1 2 3 4 5 6 7 8 9 10 11 |
class User extends BaseUser implements EquatableInterface { ........ public function isEqualTo(UserInterface $user) { // TODO: Implement isEqualTo() method. return md5($user->getUsername()) == md5($this->getUsername()) && md5(serialize($user->getRoles())) == md5(serialize($this->getRoles())); } ....... |
这个方法返回ture等于用户没有变动,如果返回false就会重新加载用户。
如何使用
来到indexAction,确保你的程序已经登录。并且登录用户不存在“ROLE_ADVANT”角色
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public function indexAction(Request $request) { $em=$this->getDoctrine()->getManager(); $userentity=$this->getUser(); // $userentity->setRoles(array('ROLE_ADVANT','ROLE_ADMIN')); $userentity->addRole('ROLE_ADVANT'); $em->persist($userentity); $em->flush(); return $this->render('default/index.html.twig', array( )); } |
twig模板要加入判断以便演示(当然也可以查看debug工具中的security):
1 2 3 |
{% if is_granted('ROLE_ADVANT') %} 已成功添加 ROLE_ADVANT {% endif %} |
ok,你已经成功的重新加载了用户。
注意:在indexAction中不要加入$this->isGranted(“ROLE_XXX”),来做判断,否则重新加载不会启用。
当然,还有别的方法。例如,重新生成Token
123456789101112131415 $em = $this->getDoctrine()->getManager();$loggedInUser = $this->get('security.context')->getToken()->getUser();$loggedInUser->addRole('ROLE_XYZ');$em->persist($loggedInUser);$em->flush();$token = new \Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken($loggedInUser,null,'main',$loggedInUser->getRoles());$this->container->get('security.context')->setToken($token);这个文章可供参考: