Пользовательский кодировщик паролей Symfony2 (bcrypt) - PullRequest
13 голосов
/ 21 ноября 2011

Я написал свой собственный кодер пароля, который реализует 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;
    }
}

Кодер зарегистрирован как сервис с идентификатором 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 ]

42 голосов
/ 01 марта 2013

Начиная с Symfony 2.2, BCrypt изначально поддерживается , поэтому вы можете легко настроить его следующим образом:

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

Возможно, вы захотите увеличить стоимость, если у вас достаточно быстрый сервер.

11 голосов
/ 22 ноября 2011

По состоянию на ноябрь 2011 года, до Symfony 2.2, это напрямую не поддерживается.

Вместо того, чтобы изобретать велосипед, я предлагаю вам использовать пакет Blowfish Password Encoder, который я написал (ElnurBlowfishPasswordEncoderBundle) , который решает ту же проблему. Или, по крайней мере, вы можете увидеть, как это реализовано.

Если вы используете Symfony 2.2 или более позднюю версию, см. Ответ Seldaek для инструкций по настройке .

4 голосов
/ 21 ноября 2011

Ваш encoders раздел должен выглядеть следующим образом:

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

где Acme\UserBundle - это, конечно, пространство имен вашего поставщика и пакета.

Для справки, полный пример конфигурации безопасности здесь .

РЕДАКТИРОВАТЬ: Способ, которым работает фабрика энкодера (исходный код здесь , соответствующие строки начинаются со строки 33):что в вашем конфиге вы дали фреймворку класс и кодировщик для использования в этом классе.Он не зависит от Doctrine, поэтому просто укажите полное имя класса вашего пользовательского объекта в конфигурации вместо «пользовательского объекта», и когда ваш пароль закодирован, Symfony будет знать, как его обрабатывать.

...