我使用的是Spring Security和Spring Boot。我也使用了UserDetails和UserDetailsService。
当执行传递到DaoAuthenticationProvider类和方法additionalAuthenticationChecks(...)时,SaltSource为空。
你知道为什么吗?也许需要配置?THX。
答案 0 :(得分:1)
您必须设置盐源。例如,请参阅此问题作为可能的方法:https://stackoverflow.com/a/26149525/185031
答案 1 :(得分:1)
需要配置SaltSource。您可以使用其中一个可用的实现:SystemWideSaltSource或ReflectionSaltSource。
如果选择ReflectionSaltSource,则必须指定UserDetails的哪个属性将用于salt。您可以使用UserDetails实现的任何现有属性(即用户名)或特定的盐场。
从安全角度来看,您应该更好地考虑安全生成的随机盐。在这种情况下,BCryptPasswordEncoder为您完成工作(生成salt并使用密码存储它)。
以下是here找到的示例配置。 在XML中:
<bean id="authProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="customUserService" />
<property name="passwordEncoder" ref="encoder" />
</bean>
<bean id="encoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
在java中:
auth.jdbcAuthentication().dataSource(dataSource)
.passwordEncoder(passwordEncoder())
.usersByUsernameQuery("sql...")
.authoritiesByUsernameQuery("sql...");