2017-08-18 28 views
0

私は、いくつかのバンドルを含むSymfony 3.3 Webアプリケーションを開発しています。symfony 3.3、認証、bcrypt、不正な資格情報

次のように、管理者ユーザーをデータベースに登録する方法を定義しようとしています。私はデータベースにユーザーを作成することができますが、その後、私はそのユーザーとしてログインできません:私はいつも悪い資格情報を取得します。私は物事がより良い方法で整理できることを知っていますが、私が見逃していることを理解したいと思います。

だから私は、AdminBundleを持って、その中に、私はUserクラスを定義しています

<?php 

namespace myApp\AdminBundle\Entity; 


use FOS\UserBundle\Model\User as BaseUser; 
use Doctrine\ORM\Mapping as ORM; 


/** 
* @ORM\Entity 
* @ORM\Table(name="fos_user") 
*/ 
class User extends BaseUser 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    public function __construct() 
    { 
     parent::__construct(); 

    } 
} 
?> 

とのRegisterAction

/** 
    * register main user/admin 
    * 
    * @Route("/register/{nameuser}", name="Jus_Admin_register") 
    * @Method("GET") 
    * @Template() 
    */ 
    public function registerAction($nameuser) 
     { 

    $user = new User(); 
    $user->setUsername($nameuser); 
    $user->setEmail('[email protected]'); 
    $plainPassword = 'pw'; 
    $encoder = $this->get('security.encoder_factory')->getEncoder($user); 
    $encoded = $encoder->encodePassword($user, $plainPassword); 

    $user->setPassword($encoded); 
    $user->setEnabled(TRUE); 
    $user->setSuperAdmin(TRUE); 
    $userManager = $this->container->get('fos_user.user_manager'); 
    $userManager->updateUser($user); 

    return $this->render('myAppAdminBundle:Admin:login.html.twig');  
} 

私のsecurity.ymlがあります

security: 
    encoders: 
     myApp\AdminBundle\Entity\User: 
      algorithm: bcrypt 
      cost: 10 
      iterations: 1 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

    providers: 
     our_db_provider: 
      entity: 
       class: myApp\AdminBundle\Entity\User 
       property: username 
.... 
    firewalls: 
     admin_area: 
      pattern: ^/myApp/Admin 
      anonymous: ~ 
      form_login: 
       login_path: /myApp/Admin/login 
       check_path: /myApp/Admin/login_check 
      logout: 
       path: /myApp/Admin/logout 
       target: /myApp/Admin/admin 
      http_basic: 
       realm: "Admin reserved" 

      context: primary_auth 

と私をconfig.ymlは(実際に私は次のものが必要かどうかはわかりません):

fos_user: 
    db_driver: orm # other valid values are 'mongodb' and 'couchdb' 
    firewall_name: admin_area 
    user_class: myApp\AdminBundle\Entity\User\ 
    from_email: 
     address: "%mailer_user%" 
     sender_name: "%mailer_user%" 

私はhttp://localhost/myApp/Admin/register/adminを呼び出す場合は、以下のレコードがテーブルfos_userに挿入されています

-- 
-- Dumping data for table `fos_user` 
-- 

INSERT INTO `fos_user` (`id`, `username`, `username_canonical`, `email`, `email_canonical`, `enabled`, `salt`, `password`, `last_login`, `confirmation_token`, `password_requested_at`, `roles`) VALUES 
(1, 'admin', 'admin', '[email protected]', '[email protected]', 1, NULL, '$2y........yq', NULL, NULL, NULL, 'a:1:{i:0;s:16:\"ROLE_SUPER_ADMIN\";}'); 

はしかし、私は、ログインすることはできませんよ。ログ:

[2017-08- .. ....] security.INFO:認証要求が失敗しました。 {code:0}:悪質な資格情報/..../vendor/symfony/symfony/src/Symfony/Component/Security( "例外": "[オブジェクト](symfony \ Component \ Security \ Core \ Exception \ BadCredentialsException /Core/Authentication/Provider/UserAuthenticationProvider.php:91、Symfony \ Component \ Security \ Core \ Exception \ BadCredentialsException(コード:0):提示されたパスワードは無効です。/...../vendor/symfony/symfony/ SRC/symfonyの/コンポーネント/セキュリティ/コア/認証/プロバイダ/ DaoAuthenticationProvider.php:67) "} []

おかげで、私はあなたの助け

PS感謝しています。 in_memoryセキュリティプロバイダを使用している場合、私のアプリはかなりうまく動作します

+0

:それは2つの引数を受け入れますか? –

答えて

1

パスワードを手動でハッシュする必要はありません。更新時にユーザマネージャによってハッシュされます。単純なパスワードを設定してください。

$user = new User(); 
... 
$user->setPlainPassword('pw'); 
... 
$userManager->updateUser($user); 

手動でハッシュする場合は、encodePasswordコールを修正します。あなたは `sha512`エンコーダを試してみました、プレーンパスワードと塩

$encoded = $encoder->encodePassword('pw', $user->getSalt()); 

https://github.com/symfony/security-core/blob/master/Encoder/PasswordEncoderInterface.php#L29

+0

はい、私はそれを見たことがあります。私は 'setPlainPassword'について知らなかった。インクルードしても '$ user-> getSalt()= NULL'でも' encodePassword'でもうまく動作します。完璧! Thks Cheers m。 – mario

関連する問題