0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Spring Securityでconfigure(auth: AuthenticationManagerBuilder)メソッドをアップデートする

Posted at

この記事を書いたきっかけ

先日(2022年5月26日)、Spring Securityに脆弱性が発見されました(ソースはこちら)。
幸いにも、脆弱性が見つかった"RegexRequestMatcher"を使用してはいませんでしたが、せっかくの機会なのでSpring Securityをアップデートしようと決意しました。
しかし!!今まで継承していた"WebSecurityConfigurerAdapter"がdeprecatedになってしまいました。
偉大なるQiita先輩本家のブログを参考に移行を試みましたが、新しい書き方がどうしてもわからない部分があり、数時間悪戦苦闘した結果、ようやく書き方がわかったのでまとめます。

ハマりポイント

問題となったのは以下の部分。
認証時のユーザー名・パスワード・ロールをDBに収納するような設計にしており、そのためconfigure(auth: AuthenticationManagerBuilder)のauth.jdbcAuthentication()を呼び出していまいました。これをどう移行すればいいのかわからなかった。

SecurityConfig.kt

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())
    }
}

どう直したか

下のように直したら動きました。

SecurityConfig.kt

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ドキュメントより

ここ違うよ〜、などありましたら、コメントください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?