jjc*_*pek 3 passwords grails salt spring-security
我的网络应用程序使用Spring Security插件进行身份验证和授权.我正在构建一种API,我需要验证用户密码.
Spring Security配置为使用带有5个loground和BC username属性的BCrypt 作为salt:
grails.plugins.springsecurity.password.algorithm = 'brcypt'
grails.plugins.springsecurity.password.bcrypt.logrounds = 5
grails.plugins.springsecurity.dao.reflectionSaltSourceProperty = 'username' // password salting
Run Code Online (Sandbox Code Playgroud)
现在,在我的控制器中,我想验证用户密码和登录.为此,我打电话springSecurityService.encodePassword(cmd.password, cmd.username)
cmd命令对象在哪里与我的参数.问题是,在每个请求中,编码的密码springSecurityService是不同的,并且与数据库中的用户密码不同.我也尝试在encodePassword调用中使用常量值,类似于:
springSecurityService.encodePassword('foo', 'bar')结果是相同的:在每个请求上编码的密码是不同的.这样我无法验证用户密码并从数据库获取有效的用户实例.
任何想法如何解决这个问题?
bcrypt每次生成一个uniq salt,并将其包含在结果哈希中.因为它springSecurityService.encodePasswod只是忽略了第二个参数,也reflectionSaltSourceProperty选择了选项(参见来源).因此,每次为相同的输入数据获取不同的哈希值.
您可以使用BCrypt类来验证密码,例如:
if (BCrypt.checkpw(candidate_password, stored_hash))
System.out.println("It matches");
else
System.out.println("It does not match");
Run Code Online (Sandbox Code Playgroud)
请参阅BCrypt的文档:http://static.springsource.org/autorepo/docs/spring-security/3.1.x/apidocs/org/springframework/security/crypto/bcrypt/BCrypt.html
顺便说一下,当你使用Spring Security时,它已经在框架中实现了,所以你可以使用passwordEncoderbean:
def passwrodEncoder
...
passwordEncoder.isPasswordValid(user.password, cmd.password, user.username) //user.username will be ignored
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1134 次 |
| 最近记录: |