【问题标题】:Check if user credentials match, without authenticating检查用户凭据是否匹配,无需进行身份验证
【发布时间】:2014-06-28 12:05:29
【问题描述】:

使用 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
    }
}

【问题讨论】:

标签: php symfony authentication fosuserbundle


【解决方案1】:

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

/**
 * @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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-15
    • 2017-07-10
    • 2018-04-21
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    相关资源
    最近更新 更多