【问题标题】:Symfony4 encode password in Security FolderSymfony4 在安全文件夹中编码密码
【发布时间】:2019-03-05 13:00:43
【问题描述】:

我正在使用保护功能进行身份验证。问题是我必须给我的用户输入密码,他不必知道这个密码,所以我选择生成一个随机密码。问题是我不在控制器中,所以我不能使用 UserPasswordEncoderInterface ...所以我在这里寻求帮助。

我给你一些代码:

 public function getUser($credentials, UserProviderInterface $userProvider)
{
    /**
     * @var FacebookUser $facebookUser
     */
    $facebookUser = $this->getFacebookClient()
        ->fetchUserFromToken($credentials);

    $email = $facebookUser->getEmail();

    $user = $this->em->getRepository('App:User')
        ->findOneBy(['email' => $email]);
    if (!$user) {
        $user = new User();
        $user->setEmail($facebookUser->getEmail());
        $user->setName($facebookUser->getFirstName());
        $user->setLastName($facebookUser->getLastName());
        $user->setRoles(["ROLE_USER"]);

        //TODO HASH PASSWORD

        $user->setPassword(bin2hex(random_bytes(80)));
        $this->em->persist($user);
        $this->em->flush();
    }

    return $user;
}

以及来自控制器的方法

/**
 * After going to Facebook, you're redirected back here
 * because this is the "redirect_route" you configured
 * in config/packages/knpu_oauth2_client.yaml
 * @Route("/connect/facebook/check", name="connect_facebook_check")
 *
 * @return JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse
 */
public function connectCheckAction() {
    if (!$this->getUser()) {
        return new JsonResponse(array('status' => false, 'message' => "User not found!"));
    } else {
//            $em = $this->getDoctrine()->getManager();
//
//            $user = $this->getUser();
//            $password = bin2hex(random_bytes(80));
//            $hash = $encoder->encodePassword($user, $password);
//            $user->setPassword($hash);
//
//            $em->persist($user);
//            $em->flush();

        return $this->redirectToRoute('default');
    }
}

【问题讨论】:

    标签: symfony security authentication hash symfony4


    【解决方案1】:

    您可以通过构造函数注入 EncoderFactoryInterface:

    /**
     * @var EncoderFactoryInterface
     */
    private $securityEncoderFactory;
    
    public function __construct(EncoderFactoryInterface $securityEncoderFactory)
    {
        $this->securityEncoderFactory = $securityEncoderFactory;
    }
    

    然后使用:

    $encoder = $this->securityEncoderFactory->getEncoder($user);
    $encoder->encodePassword($user, $password);
    

    【讨论】:

      【解决方案2】:

      您可以使用 PHP 的函数 password_hash 对您随机生成的密码进行哈希处理。参见文档here

      【讨论】:

      • 坏坏坏主意。至少在 Symfony 环境中。密码编码器的存在是有原因的。注入并使用它。
      • @Cerad 为什么?我同意通常注入和使用密码编码器是一个更好的主意,但在这种特殊情况下,使用 password_hash 似乎没问题。编码器也在内部使用这个函数。
      • 除了 password_hash 以及其他散列方法有许多可用选项。默认选项往往会随着时间而改变。使用 Symfony 密码编码器,您可以确信哈希不会改变,除非您专门配置它。将 password_hash 隐藏在代码的内部,而系统的其余部分使用编码器,这只会让人头疼。
      猜你喜欢
      • 1970-01-01
      • 2018-10-25
      • 2012-11-29
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 2013-02-02
      • 2017-07-08
      • 1970-01-01
      相关资源
      最近更新 更多