Egyedi passwordEncoder

Ha kézzel akarjuk mappelni, hogy melyik típusú jelszót mivel encode-oljuk, akkor hasznos lehet a következő. Akkor is jól jöhet, ha teljesen egyedi passwordEncoder-re van szükségünk, pl SHA1-re.

@Bean
fun delegatingPasswordEncoder(): PasswordEncoder {
    val defaultEncoder: PasswordEncoder = SHA1PasswordEncoder()
    val encoders: MutableMap<String, PasswordEncoder> = HashMap()
    encoders["bcrypt"] = BCryptPasswordEncoder()
    encoders["sha1"] = SHA1PasswordEncoder()
    val passwordEncoder = DelegatingPasswordEncoder(
        "sha1", encoders
    )
    passwordEncoder.setDefaultPasswordEncoderForMatches(defaultEncoder)
    return passwordEncoder
}

class SHA1PasswordEncoder : PasswordEncoder {

    companion object {
        private val INSTANCE: PasswordEncoder = SHA1PasswordEncoder()
        fun getInstance() = INSTANCE
    }

    override fun encode(rawPassword: CharSequence?): String =
        sha1Encode(rawPassword.toString()).apply {
            println("Source: $rawPassword")
            println("Encoded: $this")
        }

    override fun matches(rawPassword: CharSequence?, encodedPassword: String?): Boolean =
        encode(rawPassword) == encodedPassword

    private fun sha1Encode(data: String?): String {
        return DigestUtils.sha1Hex(data)
    }

}

Ennek használatához a SecurityConfig-ban kell definiálnunk egy DaoAuthenticationProvider beant, aminek meg lehet adni a passwordEncodert és a userDetailsService-t.

Ezt követően egy AuthenticationManager bean-t kell létreozni, ami pedig ezt felszedi és megeteti vele a security configunkat.

@Bean
fun authManager(http: HttpSecurity): AuthenticationManager {
    val authenticationManagerBuilder = http.getSharedObject(
        AuthenticationManagerBuilder::class.java
    )
    authenticationManagerBuilder.authenticationProvider(daoAuthenticationProvider())
    return authenticationManagerBuilder.build()
}

@Bean
fun daoAuthenticationProvider(): DaoAuthenticationProvider {
    val daoAuthenticationProvider = DaoAuthenticationProvider()
    daoAuthenticationProvider.setPasswordEncoder(delegatingPasswordEncoder())
    daoAuthenticationProvider.setUserDetailsService(userDetailsService)
    return daoAuthenticationProvider
}