13

我编写了自己的密码编码器,它实现了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是我的用户对象。我修改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

这对我来说没有任何意义。

4

3 回答 3

42

从 Symfony 2.2 开始,原生支持BCrypt ,因此您可以轻松配置它:

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

如果您有足够快的服务器,您可能需要向上调整成本。

于 2013-03-01T19:23:18.860 回答
11

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

我建议您不要重新发明轮子,而是使用我编写的 Blowfish 密码编码器包 ( ElnurBlowfishPasswordEncoderBundle),它可以解决同样的问题。或者,至少,您可以看到它是如何实现的。

如果您使用的是 Symfony 2.2 或更高版本,请参阅 Seldaek 的配置说明答案

于 2011-11-21T22:39:49.133 回答
4

您的encoders部分应如下所示:

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

当然,Acme\UserBundle您的供应商和捆绑名称空间在哪里。

作为参考,可以在此处找到完整的示例安全配置。

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

于 2011-11-21T14:50:39.360 回答