使用Symfony

时间:2016-04-11 21:18:21

标签: authentication hash fosuserbundle symfony

我正在使用Symfony3和FOSUserBundle,并使用以下代码启用成员实体(来自迁移的数据库),使用我们的类&#34以通常的密码登录; clubEncoder"而不是Symfony的默认bcrypt。 " clubEncoder"记录成员的工作正常(如下所示)。理想情况下,我希望能够在后台执行以下操作:

  1. 尝试使用bcrypt
  2. 对用户进行身份验证
  3. 如果失败,则尝试使用" clubEncoder"再次进行身份验证。上课
  4. 如果用户使用" clubEncoder"进行身份验证那么应该使用bcrypt重新生成数据库中的密码哈希(所以步骤#1可以工作)。
  5. 我的问题:

    1. 我假设我需要更改security.yml以指定两个编码器。但是,我读过的文章只描述了使用不同的编码器来处理不同的用户子集 - 而我想在所有用户身上试用它们......这仍然可以吗?

    2. 要重新生成数据库中的密码哈希,我假设需要更改控制器,但是因为我使用FOSUserBundle我没有自定义的路由。这是想要添加代码的错误位置吗?

    3. **以下是我目前稳定并且正在为第2步工作的代码:

      config.yml

      imports:
          - { resource: parameters.yml }
          - { resource: security.yml }
          - { resource: services.yml }
      
      fos_user:
          db_driver: orm 
          firewall_name: main
          user_class: AppBundle\Entity\Member
      

      security.yml

      security:
          encoders:
              AppBundle\Entity\Member:
                id: club.member_encoder
      
          // AppBundle\Entity\Member:
          //    id: bcrypt
      

      parameters.yml

      services:
          club.member_encoder:
              class: AppBundle\Service\clubEncoder
      

      clubEncoder.php

      namespace AppBundle\Service;
      
      use Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface;
      
      class clubEncoder extends \Symfony\Component\Security\Core\Encoder\BCryptPasswordEncoder implements PasswordEncoderInterface
      {
          function __construct($cost=13)
          {
              parent::__construct($cost);
          }
      
      
          function isPasswordValid($encoded, $raw,$salt)
          {
              if (parent::isPasswordValid($cost=13, $encoded,$raw,$salt)) return true ;
      
              else if ($this->comparePasswords($encoded, sha1("3^1nD".$raw."Hx&&%"))) {
      
                  // ADD SOMETHING HERE TO RE-HASH THE PASSWORD TO BCRYPT???????????????????
      
                  return !$this->isPasswordTooLong($raw) &&
                          $this->comparePasswords($encoded, sha1("ThisIsSaltA".$raw."ThisIsSaltB"));
              }
          }
      }
      

0 个答案:

没有答案