- Spring Boot 1.4.3.RELEASE
- Spring Security 4.1.4.RELEASE (4.2.1.RELEASEでも同様)
Spring SecurityでUserDetailsService
を実装し、認証失敗時のメッセージを変更したい。
対象外
以下のいずれかに該当する場合は対象外です。
- Spring Securityのメッセージを使用しない
- Spring Security 4.1.0.RELEASEの機能を使わない
-
AuthenticationProvider
を実装している -
UserDetailsService
を使わない
想定手順と説明
-
UserDetailsService
を実装してBean定義する。 -
messages.properties
にSpring Securityのキーでメッセージを追加する。
以上。
UserDetailsService
の実装 (してない)
@Service
public class MyUserDetailsService implements UserDetailsService {
// いい感じに実装する
}
messages.properties
(抜粋)
AbstractUserDetailsAuthenticationProvider.badCredentials=ユーザーIDかパスワードが違います。
キーはデフォルトのmessages.properties を参照するのが早い。ドキュメントは見つけられていない。
説明
4.1.0で追加された InitializeUserDetailsBeanManagerConfigurer
が、AuthenticationManagerBuilder
が未設定の場合のみ動作。
コンテナからUserDetailsService
とPasswordEncoder
を拾ってきてDaoAuthenticationProvider
を作って登録してくれる。
AuthenticationManagerBuilder
の設定は不要。
・・・であるはずだった。
期待はずれの挙動
例外メッセージがデフォルトから変わらず、「Bad credentials」になる。
MessageResource
があればMessageSourceAware
で書き換えられる想定だった。
MessageResource
はSpring Bootが作ってくれている。
にもかかわらず、DaoAuthenticationProvider
のMessageSourceAccessor
はSpringSecurityMessageSource
のままである。
この場の解決
AuthenticationManagerBuilder
を使って設定しておけばDaoAuthenticationConfigurer
を介して設定してくれる。
つまり、いままで通りに以下を記述する。
@Autowired
void authenticationManagerBuilder(AuthenticationManagerBuilder builder,
UserDetailsService service) {
builder.userDetailsService(service).passwordEncoder(passwordEncoder());
}