我的网络应用使用Spring Security插件进行身份验证和授权。我正在构建一种API,我需要验证用户密码。
Spring Security配置为使用具有5个loground和username
属性的BCrypt作为salt:
grails.plugins.springsecurity.password.algorithm = 'brcypt'
grails.plugins.springsecurity.password.bcrypt.logrounds = 5
grails.plugins.springsecurity.dao.reflectionSaltSourceProperty = 'username' // password salting
现在,在我的控制器中,我想验证用户密码和登录。为此,我致电springSecurityService.encodePassword(cmd.password, cmd.username)
其中cmd
是我的参数的命令对象。问题是,在每个请求中,使用springSecurityService
编码的密码是不同的,并且与数据库中的用户密码不同。我在encodePassword
调用中也尝试使用常量值,如下所示:
springSecurityService.encodePassword('foo', 'bar')
和结果相同:在每个请求上编码的密码都不同。这样我无法验证用户密码并从数据库获取有效的用户实例。
任何想法如何解决这个问题?
答案 0 :(得分:6)
bcrypt
每次生成一个uniq salt,并将其包含在结果哈希中。因为它springSecurityService.encodePasswod
只是忽略第二个参数,reflectionSaltSourceProperty
选项也是如此(see sources)。因此,每次为相同的输入数据获取不同的哈希值。
您可以使用BCrypt
类来验证密码,例如:
if (BCrypt.checkpw(candidate_password, stored_hash))
System.out.println("It matches");
else
System.out.println("It does not match");
顺便说一下,当您使用Spring Security时,它已经在框架中实现,因此您可以使用passwordEncoder
bean:
def passwrodEncoder
...
passwordEncoder.isPasswordValid(user.password, cmd.password, user.username) //user.username will be ignored