ちょっと待って!そのUserDetails、本当に必要ですか?
概要
Spring Boot の認証を実装してみた系のサンプルでよく UserDetails や UserDetailsService が用いられているが、必然性が不明なものがほとんどである。
(おそらく当の実装者も理解していない1。)
ここでは UserDetails を使わない、よりシンプルな認証を実装してみた。
参考リンク
- Spring Security Architecture の Authentication and Access Control
- TERASOLUNA のリファレンスなら日本語で読める!
 
 - 6.8.4 Overriding or Replacing Boot Auto Configuration - Spring Security Reference
 
実装サンプル
tags/simple-authentication-exampleタグ- user テーブルを select して id/password を検証するバージョンは
tags/simple-authentication-db-exampleタグ 
- user テーブルを select して id/password を検証するバージョンは
 
解説
参考リンク先にある通り、自分で認証処理を作りたい場合、 AuthenticationProvider を実装してそれを用いるように設定すれば良い。
サンプルコードでは、 MyAuthenticationProviderが該当の認証プロバイダで、これを用いるように設定しているのが MyWebSecurityConfigurerAdapterである。
(終わり)
実行して確認
http://localhost:8080/hello へアクセスすると Basic 認証のダイアログが出るので、 tags/simple-authentication-example であれば username に mynameを(パスワードは何でも良い)、tags/simple-authentication-db-exampleタグのものであれば username に user1, password にpassword1を入力すれば認証が通る。
追記: んで結局 UserDetails ってなんなのさ
Think of
UserDetailsas the adapter between your own user database and what Spring Security needs inside theSecurityContextHolder.
だって。そんな汎用的に使えるもんかあ?余計なメソッド多すぎじゃね…?
spring-security-oauth2 を使ったとき principal を完全に独自の型にしていたらフレームワーク内の getName()呼び出しでtoString()されて困ったので、UserDetailsは実装しなくともAuthenticatedPrincipalは実装しといたほうが良さげ。
- 
もちろん私もそんなコードを理解できません。 ↩︎