检查用户凭据是否匹配,无需进行身份验证

时间:2014-05-10 22:02:14

标签: php symfony authentication fosuserbundle

使用FOSUserbundle,我想实现以下目标:

1)用户使用“用户名”和“密码”参数提交POST。密码是纯文本。

2)在控制器中,我像往常一样解析参数:

/**
 * @Route("/api/token",name="api_token")
 */
public function tokenAction(Request $request) {

    $username = $request->get('username');
    $password = $request->get('password');

    // ...
}

3)最后,如果凭证匹配,我会返回一些内容。

请注意,我希望在不修改会话的情况下执行此操作,即无需实际验证用户身份并设置令牌。我只想检查凭据是否匹配。

更新

接受的答案有效,但只能假设你有一个活跃的会话。如果您想解决只是公开REST层等(这是我的用例)的情况,您可以执行以下操作,假设您的用户名是唯一的:

/**
 * @Route("/api/token",name="api_token", options={"expose"=true})
 */
public function getTokenAction(Request $request) {
    $username = $request->get('username');
    $password = $request->get('password');

    $user = $this->getDoctrine()
                 ->getRepository('YourUserClass')
                 ->findOneBy(["username" => $username]);

    $encoder = $this->get('security.encoder_factory')->getEncoder($user);

    $isValidPassword = $encoder->isPasswordValid($user->getPassword(),
                                                 $password,
                                                 $user->getSalt());

    if ($isValidPassword) {
        // Handle success
    } else {
        // Handle error
    }
}

1 个答案:

答案 0 :(得分:2)

您应该使用身份验证服务来执行此操作,将所有代码写入控制器不是最佳做法。无论如何,对于你的回答,你可以使用这个:

/**
 * @Route("/api/token",name="api_token")
 */
public function tokenAction(Request $request) {

    $username = $request->get('username');
    $password = $request->get('password');

    // fetch your user using user name
    $user = ...

   //If your controller is extended from Symfony\Bundle\FrameworkBundle\Controller\Controller
   $encoder = $this->get('security.encoder_factory')->getEncoder($user);
   //If you are extending from other ContainerAware Controller you may have to do 
   //$this->container->get('security.encoder_factory')->getEncoder($user)

   //Check your user
    $isValidPassword = $encoder->isPasswordValid(
            $user->getPassword(),
            $password,
            $user->getSalt()
    );

    if ($isValidPassword) {
       //.... do your valid stuff
    }else{
       //... Do your in valid stuff
    }
}