2017-11-02 11 views
0

私は、いくつかのガード認証者によって保護されたSymfonyアプリケーションを持っています。そのうちの2つは、この質問に関係します。ユーザーのx509証明書を確認する認証者が1人あり、失敗した場合は従来のログインフォームが表示されます。Symfonyガードは認証失敗から復旧します

私はSonata/FOSユーザーバンドルも使用しています。そのバンドルは、ユーザーがcredentials_expire_atプロパティを持っているかどうかをチェックし、credentials_expire_at <= now()の場合はCredentialsExpiredExceptionをスローします。

問題は、すべての認証者のチェックが行われますが、証明書にはユーザのcredentials_expire_atプロパティに関連しない独自の有効期限があります。

次のような状況があります。ユーザーがサイトにアクセスし、有効な証明書を提供しています。ユーザーのアカウントに過去にcredentials_expire_atが設定されているため、CredentialsExpiredExceptionがスローされます。

これが発生すると、GuardのメソッドonAuthenticationFailure()が呼び出され、例外とユーザーにアクセスできます。ですから、その時点で私はユーザーを知っていますし、認証が(不正に)失敗した理由を知っています。

私の質問はです。この状況からどのように復旧できますか? スローされた例外にかかわらずsymfonyがユーザを認証します。

答えて

0

かなり簡単です。

例外はUserCheckerサービス(security.user_checker.main)によってスローされます。

が、私は基本的にsymfonyによって提供さUserCheckerを拡張し、checkPostAuth方法オーバーライド:だから

public function checkPostAuth(UserInterface $user) 
{ 
    try { 
     parent::checkPostAuth($user); 
    } catch (CredentialsExpiredException $exception) { 
     if (!$user->isCertificateLogin()) { 
      throw $exception; 
     } 
    } 
} 

を、これはCredentialsExpiredExceptionをキャッチし、ユーザーは、証明書認証を経てログインしていなかったときにそれを再スローします。

最後のステップは、ちょうど私のservices.ymlにサービスを登録することです。

security.user_checker.main: 
    class: AppBundle\Security\UserChecker 

私はそれのためにCompilerPassを追加することが期待が、それはそれは必要ありませんが判明しました。

関連する問題