ちょっと待って!そのUserDetails、本当に必要ですか?
   2 min read

概要

Spring Boot の認証を実装してみた系のサンプルでよく UserDetailsUserDetailsService が用いられているが、必然性が不明なものがほとんどである。
(おそらく当の実装者も理解していない1。)

ここでは UserDetails を使わない、よりシンプルな認証を実装してみた。

参考リンク

実装サンプル

解説

参考リンク先にある通り、自分で認証処理を作りたい場合、 AuthenticationProvider を実装してそれを用いるように設定すれば良い。

サンプルコードでは、 MyAuthenticationProviderが該当の認証プロバイダで、これを用いるように設定しているのが MyWebSecurityConfigurerAdapterである。

(終わり)

実行して確認

http://localhost:8080/hello へアクセスすると Basic 認証のダイアログが出るので、 tags/simple-authentication-example であれば username に mynameを(パスワードは何でも良い)、tags/simple-authentication-db-exampleタグのものであれば username に user1, password にpassword1を入力すれば認証が通る。

追記: んで結局 UserDetails ってなんなのさ

https://docs.spring.io/spring-security/site/docs/5.1.5.RELEASE/reference/htmlsingle/#tech-userdetailsservice

Think of UserDetails as the adapter between your own user database and what Spring Security needs inside the SecurityContextHolder.

だって。そんな汎用的に使えるもんかあ?余計なメソッド多すぎじゃね…?


spring-security-oauth2 を使ったとき principal を完全に独自の型にしていたらフレームワーク内の getName()呼び出しでtoString()されて困ったので、UserDetailsは実装しなくともAuthenticatedPrincipalは実装しといたほうが良さげ。


  1. もちろん私もそんなコードを理解できません。 ↩︎