Symfony2自定义密码编码器(bcrypt)

时间:2011-11-21 14:44:15

标签: symfony bcrypt

我编写了自己的密码编码器来实现PasswordEncoderInterface

class BCryptPasswordEncoder implements PasswordEncoderInterface {
    protected $encoder;

    public function __construct(BCryptEncoder $encoder) {
        $this->encoder = $encoder;
    }

    public function encodePassword($raw, $salt) {
        return $this->encoder->encodeString($raw, $salt);
    }

    public function isPasswordValid($encoded, $raw, $salt) {
        return $this->encoder->encodeString($raw, $salt) == $encoded;
    }
}

编码器已注册为ID为bcrypt.password.encoder的服务。但我不知道,如何告诉symfony使用它。 目前app/config/security.yml看起来像这样:

security:
    encoders:
        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:
        neo4j:
          id: security.user.provider.neo4j
    firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false
        secured_area:
            provider: neo4j
            pattern:    ^/.*
            form_login:
                check_path: /login_check
                login_path: /login
            logout:
                path:   /logout
                target: /
            anonymous: ~
    access_control:
        - { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/.*, role: ROLE_ADMIN }

顺便说一下,我没有使用任何学说实体。

修改Symfony\Component\Security\Core\User\User是我的UserObject。我稍微修改了security.yml

encoders:
    Symfony\Component\Security\Core\User\User: 
        id: bcrypt.password.encoder

导致致命错误:

Catchable Fatal Error: Argument 1 passed to EMC3\Bundle\UserBundle\Neo4jUserProvider::__construct() must be an instance of EMC3\Bundle\UserBundle\UserManager, instance of EMC3\Bundle\UserBundle\BCryptEncoder given, called in /var/www/emc3/app/cache/dev/appDevDebugProjectContainer.php on line 227 and defined in /var/www/emc3/src/EMC3/Bundle/UserBundle/Neo4jUserProvider.php line 29

这对我没有任何意义。

3 个答案:

答案 0 :(得分:42)

从Symfony 2.2开始,BCrypt为natively supported,因此您可以轻松配置它:

security:
    encoders:
        Symfony\Component\Security\Core\User\User:
            algorithm: bcrypt
            cost: 7

如果你的服务器足够快,你可能想要调高成本。

答案 1 :(得分:11)

截至2011年11月,在Symfony 2.2之前,这不是直接支持的。

我建议您使用Blowfish Password Encoder bundle I wrote (ElnurBlowfishPasswordEncoderBundle)来解决同样的问题,而不是重新发明轮子。或者,至少,你可以看到它是如何实现的。

如果您使用的是Symfony 2.2或更高版本,see Seldaek's answer for configuration instructions

答案 2 :(得分:4)

您的encoders部分应如下所示:

encoders:
    Acme\UserBundle\Entity\User:
        id: bcrypt.password.encoder

其中Acme\UserBundle是您的供应商和捆绑名称空间,当然。

作为参考,可以找到完整的示例安全配置here

编辑:编码器工厂的工作方式(源代码here,相关行从第33行开始)是在配置中,您已经为框架提供了一个类,并且用于课程的编码器。它与Doctrine无关,所以只需在配置中提供用户对象的完全限定类名而不是“用户实体”,并且在编码密码时,Symfony将知道如何处理它。