如何以编程方式验证用户身份

时间:2013-01-24 23:21:22

标签: symfony

我有一个控制器,应该通过一个简单的表单添加用户,但我不能让用户手动验证。

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken    

public function addAction($user)
    {
           $token =new UsernamePasswordToken(
                    $user->getUsername(),
                    $user->getPassword(),
                    'secured_area',
                   $user->getRoles()
                    );

           $this->get('security.context')->setToken($token);
           // as suggested in some other answers

           $request->getSession()->set('_security_secured_area', serialize($token));
           // as suggested in http://techblog.zabuchy.net/2012/manually-authenticate-symfony-2-user/

            return $this->redirect($this->generateUrl('acme_project_secure_show' )
                    );
        }
    }

重定向到安全路由有效,但是方法$this->getUser()返回null,因为未正确设置身份验证... 我可以从$user= $this->get('security.context')->getToken();而不是$user= $this->get('security.context')->getToken()->getUser();的{​​{1}}快捷方式获取用户,请参阅图书here 知道为什么吗?

3 个答案:

答案 0 :(得分:6)

问题解决了 - 缺少两点:1)有必要为链接发送InteractiveLoginEvent -thanks mpm 2)此控制器的路由不在secured_area防火墙下 - merci Florian ;)

答案 1 :(得分:0)

你可以试试这个

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken

$token = new UsernamePasswordToken($user, $user->getPassword(), "firewallname", $user->getRoles());

答案 2 :(得分:-1)

如上所述@ user19340357,您可以手动实例化令牌。

他忘了说的是你应该在安全环境中设置它:

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken

$token = new UsernamePasswordToken($user, $user->getPassword(), "firewallname", $user->getRoles());
$securityContext = $this->container->get('security.context'); // do it your way
$securityContext->setToken($token);