2013-07-03 11 views
9

ユーザーが不正な資格情報でログインしようとしたとき、または何らかの理由でユーザーが無効になったときに、SPRING_SECURITY_LAST_EXCEPTION.message(「Bad Credentials」)を表示できました。Spring Security:UserDetailsS​​erviceからのカスタム例外メッセージ

ユーザーが無効になっている場合のカスタムメッセージを表示したいのではなく、「無効になっています...しばらくお待ちください...」と表示されません。それ、どうやったら出来るの?

私は春のセキュリティでユーザー名/パスワードを提供するためにUserDetailsS​​erviceを使用しています。

+0

あなたはhttp://stackoverflow.com/questions/1373407/how-to-display-custom-error-message-in-jsp-for-spring-security-auth-に記載されているアプローチを試したことがありますか?例外? – Jk1

+0

部分的に動作します。カスタムメッセージを受け取ることはできますが、常にAbstractUserDetailsAuthenticationProvider.badCredentialsに設定されたメッセージが返されます。 DisabledExceptionをスローしたにもかかわらず、私のJSPページのbadCredentialsに定義されているのと同じメッセージが返されます – Jayz

+0

どのバージョンを使用しているのか、どこから例外をスローしているのか、どこにメッセージを表示しているのかを教えてください。使用している実際のWebセキュリティ設定を投稿するのがおそらく最適です。 –

答えて

9

AbstractUserDetailsAuthenticationProviderのhideUserNotFoundExceptionsプロパティをfalseに設定する必要があります。 (これは、このソリューションが今後変更される可能性のあるSpring Securityコードに依存していることを意味します)。ここで

は、手順は次のとおりです(すでに1が、その後falseにそのhideUserNotFoundExceptionsプロパティを設定している場合)

(1)DaoAuthenticationProvider Beanを定義します。上記プロバイダと

@Bean 
public AuthenticationProvider daoAuthenticationProvider() { 
    DaoAuthenticationProvider impl = new DaoAuthenticationProvider(); 
    impl.setUserDetailsService(yourUserDetailsService()); 
    impl.setHideUserNotFoundExceptions(false) ; 
    return impl ; 
} 

(2)を構成認証マネージャ:ここでのJava設定のスタイルである

<authentication-manager alias="authenticationManager"> 
    <authentication-provider ref="daoAuthenticationProvider"/> 
<!-- other providers if any --> 
</authentication-manager> 

(3)に延びる例外を作成UsernameNotFoundException

public class DisabledException extends UsernameNotFoundException { 

    public DisabledException(String msg) { 
    super(msg); 
    } 

    /* other constructors */  
} 

(4)あなたのUserDetailsS​​erviceで、好きなメッセージキーで上記の例外をスローします:

throw new DisabledException(messages.getMessage(
         "AbstractUserDetailsAuthenticationProvider.disabled", "User is disabled")); 

ここでメッセージSpringSecurityMessageSource.getAccessor()

+0

Ritesh、ご返信ありがとうございます。働いていた部分はUserNotFoundExceptionを隠していました。しかし、今私は別のメッセージで私のカスタム例外をスローした場合でも、 "名前xyzのユーザーが見つかりません"というメッセージが表示されます。 – Jayz

+0

申し訳ありませんが、早すぎます。これは完全に動作します – Jayz

+0

Jayz、通常は、ユーザーを見つけられなかった場合にのみUserDetailsS​​erviceから例外をスローします(デフォルトでは、メッセージキーAbstractUserDetailsAuthenticationProvider.badCredentialsでBadCredentialsExceptionがスローされます)。無効なユーザーを指定する場合は、例外をスローして、有効フラグをfalseに設定してユーザーを戻すべきではありません(デフォルトでは、メッセージキーAbstractUserDetailsAuthenticationProvider.disabledでDisabledExceptionがスローされます)。 (たぶんこれは最初の私の答えでなければならない) – Ritesh

0

は、そのプロパティファイルでloginMessage.properties

のようなクラスパスにプロパティファイルを作成します

AbstractUserDetailsAuthenticationProvider.badCredentialsを指定=入力されたユーザ名/パスワードが間違っています。その後

throw new UsernameNotFoundException(""); 

nullの結果ならば

は、userDaoでは、あなたのapplicationContext.xmlをして

<bean id="messageSource" 
    class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>loginMessage</value> 
     </list> 
    </property> 
</bean> 

を以下の豆を追加し、u'll入力されたユーザ名/パスワードのようなメッセージが誤っている得ます。悪い資格情報の代わりに

関連する問題