1

ログインに失敗したときにsymfony2に特定のエラーメッセージを書き込むにはどうすればよいですか?状況によって異なります

例: ユーザー名が見つからない場合: ユーザー名 'userxxx' は存在しません。 ユーザー名は見つかったがパスワードが間違っている場合: 入力したパスワードが間違ってい ます。もう一度お試しください。または: 「userxxx」のパスワードが間違っています。もう一度お試しください。

ユーザー名が見つからない場合にエラー メッセージを警告する方法を見つけたのは、カスタム ユーザー プロバイダーを作成することです

class UserProvider implements UserProviderInterface {

    protected $entityManager;

    public function __construct(EntityManager $entityManager) {
        $this->entityManager = $entityManager;
    }

    public function loadUserByUsername($username) {
        $user = $this->entityManager
                ->getRepository('ShopSecurityBundle:User')
                ->findOneBy(array('username' => $username));        
        if ($user) {
            $service_user = new SecurityServiceUser($user->getUsername(), $user->getPassword(), $user->getSalt(), array($user->getRole()));
            //var_dump($service_user); die;
            return $service_user;
        }
        // I throw a BadCredentialsException() here then the error message in security Context will be changed arcodding to the exception message!
        throw new BadCredentialsException(sprintf('Username "%s" does not exist', $username));
    }
// ...
}

しかし、ユーザー名が正しいのにパスワードが間違っている場合のエラーメッセージを変更する方法がわかりません!

なにか提案を?

4

1 に答える 1

1

クリーンな解決策は、フォームフィールドの「ユーザー名」と「パスワード」にエラーを追加するか、フォームに直接エラーを追加して一般的な「エラー」を表示することです。

簡単な解決策は、変数、つまり 'error' を twig に渡すことです (FOSUserBundle が行うように)。

認証エラーに対応する例外をスローし、リスナーでキャッチします。

FOSUserBundle\Security\UserProviderおよびController\SecurityControllerで FOSUserBundle がこれをどのように解決するかを確認してください。

リスナーで例外をキャッチする方法の例は、ドキュメントの章How to create a custom Authentication Provider にあります。(ハンドルメソッドを見てください)

symfony のセキュリティ例外の概要はここにあります。

于 2013-05-28T12:59:11.907 に答える