我实现了UserDetailsService
接口并覆盖了loadUserByUsername
方法。
我认为,在loadUserByUsername
内,我可以获得用户名和密码,以检查它们是否与数据库上的用户名和密码匹配。但我无法理解如何获取用户输入的密码,只要它是可能的。
可能我正在实施错误的界面。
UserDetailsService
是否足以做我想做的事情,或者我必须实施或扩展其他内容?
答案 0 :(得分:0)
UserDetailsService
只是从数据库中检索用户详细信息 - 它不是要进行密码比较。
如果您想进行自己的密码比较 - 您可以实施自己的PasswordEncoder
(更具体地说是isPasswordValid(pass1,pass2,salt)
方法,但有几种方法可以扩展 - 例如Md5PasswordEncoder
要连接自定义PassordEncoder
,您需要提供以下内容:
<authentication-manager id="authenticationManager">
<authentication-provider user-service-ref="myUserDetailsService">
<password-encoder ref="myPasswordEncoder"/>
</authentication-provider>
</authentication-manager>
答案 1 :(得分:0)
UserDetailsService.loadUserByUsername()只是从数据库中加载(检索)用户详细信息 - 它不是要进行密码比较。
比较发生在UsernamePasswordAuthenticationFilter.attemptAuthentication()中。然后它调用getAuthenticationManager()。authenticate(),进行比较。
请参阅:What is the default AuthenticationManager in Spring-Security? How does it authenticate?
至于替换 UsernamePasswordAuthenticationFilter
,问问自己你的用例是什么?你想要做什么,默认实现不?也许你不必替换它......无论如何,你可以在Spring's docs
HTH