我正在大量阅读文档Spring 3.1安全文档,但我找不到所有问题的答案。
在springweb应用程序中,基于表单登录(user+pwd),我想用SHA-256对用户密码进行salt处理,为每个用户使用随机salt。这意味着我必须在数据库中为每个用户保存salt和散列密码。到目前为止没有问题。
-
很明显,我必须实现自己的
UserDetailsService
才能从数据库中获取用户信息,并在spring-security.xml
中进行配置。 -
似乎我必须在实现
UserDetails
的基础上添加一个额外的getSalt()
方法,以便在根据存储的哈希密码检查用户提供的登录时使用它。
然后情况就变得不清楚了。我应该拦截登录请求。从第6.4.3节来看,Spring似乎会将用户提交的凭证映射到Authentication
对象,并将其提交到AuthenticationManager
。
我的问题是:
i) Spring将向AuthenticationManager
提交Authentication
的哪些实现?如何检索名称和密码?
ii)我似乎必须实现我自己的AuthenticationManager
。每次调用authenticate(...)
时,我都会获取登录名和密码,并从数据库中获取UserDetails
。然后,用相应的salt对提供的pwd进行散列,并与数据库散列项进行比较。对的
iii)AuthenticationManager
API还具有supports(...)
方法。应该如何实施?
iv)应如何配置Authentication
和AuthenticationManager
?
我一定没有正确阅读您的问题,但Spring Security提供了开箱即用的盐水密码:
http://static.springsource.org/spring-security/site/docs/3.1.x/reference/core-services.html#d0e3021
如果8位salt不足,您可以将自己的SaltSource注入DaoAuthenticationProvider。实际上,手册强烈建议这样做。