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は私の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

それは私には意味がありません。

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 Password Encoder バンドル ( ElnurBlowfishPasswordEncoderBundle)を使用することをお勧めします。これは同じ問題を解決します。または、少なくとも、それがどのように実装されているかを見ることができます。

Symfony 2.2 以降を使用している場合は、Seldaek's answer for configuration instructions を参照してください

于 2011-11-21T22:39:49.133 に答える
4

セクションencodersは次のようになります。

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

Acme\UserBundleもちろん、ベンダーとバンドルの名前空間はどこにありますか。

参考までに、完全なセキュリティ構成の例は、ここにあります。

EDIT:エンコーダーファクトリーの仕組み(ソースコードはこちら、関連する行は33行目から始まります)は、構成で、フレームワークにクラスと、クラスに使用するエンコーダーを与えたことです。これは Doctrine に依存しないため、「ユーザー エンティティ」ではなく、config でユーザー オブジェクトの完全修飾クラス名を指定するだけで、パスワードがエンコードされると、Symfony はそれを処理する方法を認識します。

于 2011-11-21T14:50:39.360 に答える