仅在编码密码时Symfony 2.1错误凭据

时间:2012-09-23 21:14:37

标签: authentication encoding symfony password-protection

以下是我添加管理员用户的代码:

public function addAction(Request $request){
    $admin=new Admin();
    $form=$this->createForm(new AdminType(), $admin);
    if($request->getMethod()=='POST'){
        $form->bindRequest($request);
        if($form->isValid()){
            $factory = $this->get('security.encoder_factory');
            $encoder = $factory->getEncoder($admin);
            $password = $encoder->encodePassword($admin->getPassword(), $admin->getSalt());
            $admin->setPassword($password);

            $em=$this->getDoctrine()->getEntityManager();
            $em->persist($admin);
            $em->flush();
        }
    }
    return $this->render('PuzzleAdminBundle:Admin:add.html.twig', array(
        'form'=>$form->createView()
    ));
}

这是我的security.yml:

security:
encoders:
    Puzzle\AdminBundle\Entity\Admin: sha512
    Symfony\Component\Security\Core\User\User: plaintext

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

providers:
    chain_providers:
        chain:
            providers: [admin_db, in_memory]
    admin_db:
        entity: { class: Puzzle\AdminBundle\Entity\Admin, property: username }
    in_memory:
        memory:
            users:
                root: { password: 123456, roles: [ 'ROLE_SUPER_ADMIN' ] }

当我想在root上登录时,或者当我将实体编码器设置为纯文本时,一切正常。为什么在将实体编码器设置为sha512时,我总是会收到错误的凭据?

3 个答案:

答案 0 :(得分:8)

检查数据库中的字段长度。如果您正在关注" The Book"那么您的字段可能会设置为varchar(50)。 Base64编码的SHA-512将输出88个字符的字符串。为此调整,你应该好好去。

答案 1 :(得分:1)

我认为定义的'密码'值需要是后编码的值。因此,当设置为使用sha512编码器时,它将寻找的值将是'123456'的sha512哈希,而不是纯文本密码。

看看这里: http://symfony.com/doc/current/book/security.html#encoding-the-user-s-password。本节第一个例子之后的段落具体涉及这一点。

答案 2 :(得分:1)

我有问题,在我的情况下,这是一个非常愚蠢的事情,数据库中字段的长度太小