UserDetailsServiceは誤解されている
   2 min read

サンプルコード等だけを見ていると UserDetailsService を利用することがSpring Securityの唯一の認証処理実現方法だと誤解しがちですが、 UserDetailsService はむしろユーティリティライブラリくらいの立ち位置で、別に利用しなくても実現可能です。

そして、役割も誤解されがちで、これは単に認証に必要な情報を"名前をキーにして"取得するDAOです。 認証を行うクラスではありませんし、そもそも名前をキーにしないようなシステムでは適合しません。 しかしSpring Boot上でデフォルト設定で使っていると認証するためのクラスが一切出てこないので誤解してしまう、というわけです。

公式リファレンスでは次のようにあります:

UserDetailsService is a DAO interface for loading data that is specific to a user account. It has no other function other to load that data for use by other components within the framework. It is not responsible for authenticating the user. Authenticating a user with a username/password combination is most commonly performed by the DaoAuthenticationProvider, which is injected with a UserDetailsService to allow it to load the password (and other data) for a user in order to compare it with the submitted value. Note that if you are using LDAP, this approach may not work.

If you want to customize the authentication process then you should implement AuthenticationProvider yourself.

その他、次のQ&Aも参照してみてください:

要約すると、それらは UserDetailsService の役割ではなくて、 認証フィルター だったり authentication-provider だったりが為すべきことである、というのが理解されていない、というような話です。

このような誤解を避けるためにも、少なくともはじめはユーティリティクラスであるところの UserDetailsService を利用しない、シンプルなコードサンプルを参照して理解したほうが良いのではないか、と考えるに至りました。

が、そういったサンプルがどこにあるか思い浮かばなかったので(オフィシャルのサンプルも常に UserDetailsService を使っている)、自分で作りました。

関連リンク: