概要
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
UserDetails
as the adapter between your own user database and what Spring Security needs inside theSecurityContextHolder
.
だって。そんな汎用的に使えるもんかあ?余計なメソッド多すぎじゃね…?
spring-security-oauth2 を使ったとき principal を完全に独自の型にしていたらフレームワーク内の getName()
呼び出しでtoString()
されて困ったので、UserDetails
は実装しなくともAuthenticatedPrincipalは実装しといたほうが良さげ。
-
もちろん私もそんなコードを理解できません。 ↩︎