この記事を書いたきっかけ
先日(2022年5月26日)、Spring Securityに脆弱性が発見されました(ソースはこちら)。
幸いにも、脆弱性が見つかった"RegexRequestMatcher"を使用してはいませんでしたが、せっかくの機会なのでSpring Securityをアップデートしようと決意しました。
しかし!!今まで継承していた"WebSecurityConfigurerAdapter"がdeprecatedになってしまいました。
偉大なるQiita先輩や本家のブログを参考に移行を試みましたが、新しい書き方がどうしてもわからない部分があり、数時間悪戦苦闘した結果、ようやく書き方がわかったのでまとめます。
ハマりポイント
問題となったのは以下の部分。
認証時のユーザー名・パスワード・ロールをDBに収納するような設計にしており、そのためconfigure(auth: AuthenticationManagerBuilder)のauth.jdbcAuthentication()を呼び出していまいました。これをどう移行すればいいのかわからなかった。
class SecurityConfig: WebSecurityConfigurerAdapter {
@Bean
fun passwordEncoder(): PasswordEncoder? {
return BCryptPasswordEncoder()
}
@Autowired
lateinit var dataSource: DataSource
companion object {
// ユーザーIDとパスワードを取得するSQL文
private const val USER_SQL = ("SELECT user_name, password, true FROM login_spring WHERE user_name = ?")
// ユーザーのロールを取得するSQL文
private const val ROLE_SQL = ("SELECT user_name, role FROM login_spring WHERE user_name = ?")
}
//--省略--
//↓ハマりポイント
override fun configure(auth: AuthenticationManagerBuilder) {
//ログイン処理時のユーザー情報をDBから取得する
auth.jdbcAuthentication()
.dataSource(dataSource)
.usersByUsernameQuery(Companion.USER_SQL)
.authoritiesByUsernameQuery(Companion.ROLE_SQL)
.passwordEncoder(passwordEncoder())
}
}
どう直したか
下のように直したら動きました。
class SecurityConfig {
@Bean
fun passwordEncoder(): PasswordEncoder? {
return BCryptPasswordEncoder()
}
@Autowired
lateinit var dataSource: DataSource
companion object {
// ユーザーIDとパスワードを取得するSQL文
private const val USER_SQL = ("SELECT user_name, password, true FROM login_spring WHERE user_name = ?")
// ユーザーのロールを取得するSQL文
private const val ROLE_SQL = ("SELECT user_name, role FROM login_spring WHERE user_name = ?")
}
//--省略--
@Bean
fun users(): UserDetailsManager? {
val users = JdbcUserDetailsManager(dataSource)
users.setUsersByUsernameQuery(Companion.USER_SQL)
users.setAuthoritiesByUsernameQuery(Companion.ROLE_SQL)
return users
}
}
公式ブログを見る限り、JdbcUserDetailsManagerクラスをインスタンス化して、それにユーザーを加えて返却すればよいみたいです。
ちなみに、setUsersByUsernameQueryとsetAuthoritiesByUsernameQueryはJdbcDaoImplというクラスから継承したメソッドということらしいです(Springドキュメントより)
ここ違うよ〜、などありましたら、コメントください。