3

我使用 grails 进行 Web 开发,使用 Spring Security 进行身份验证和授权。

我想制作一个简单的表单来允许用户更改密码。这是一个包含三个密码字段的表单。第一个用于当前(旧)密码。第二个和第三个是用于验证的新密码,以防止意外输入错误。

问题是我无法找出根据当前密码验证旧密码的正确方法。我考虑过使用springSecurityService.encodePassword函数并比较哈希值来手动完成。但我不确定这是否是正确的做法。

此表单仅供已经登录的用户访问。如果攻击者以某种方式控制了会话(例如用户忘记注销),则询问密码应该可以阻止攻击者更改密码

有没有弹簧安全的方法来做到这一点?

4

3 回答 3

3

Spring Security Core 文档中有一个使用 的示例passwordEnconder,但springSecurityService.encodePassword也很好。

于 2013-03-31T22:59:42.360 回答
3

这就是我在 Grails 2.3 和 spring-security-core-2.0-RC4 中使用的。

import com.example.User
import grails.plugin.springsecurity.SpringSecurityService


class UserController {

   SpringSecurityService springSecurityService 

   def checkUserPasswordMatches(){
      //Get current user
      User user = springSecurityService.getCurrentUser()    

      String currentPassword = params.password

      if (!springSecurityService.passwordEncoder.isPasswordValid(user.getPassword(), currentPassword, null)) {
         log.info("INFO - Password does not match!"

         //TODO: Do something now passwords match...
      } else {
         log.info("INFO - Password matches existing user password!"

         //TODO: Do something after passwords mismatch...
      }
   }

}
于 2015-05-07T16:38:19.670 回答
0

这就是它为我服务的方式,我验证了新密码的确认。

def cambio= {
    def respuesta = [error: 1]
    SecUser user = springSecurityService.currentUser


    if (params?.j_password && params?.password && params?.old_password) {
        String oldPasword=params?.old_password
        String newPassword = params.j_password
        String newPassword2 = params.password

        if    (!springSecurityService.passwordEncoder.isPasswordValid(user.getPassword(), oldPasword, null)) {

            respuesta.error=3
            render respuesta as JSON
        }else if(newPassword == newPassword2) {

        user.setPassword(params.j_password)
        user.save()
        respuesta.error=0
        render respuesta as JSON
      }else
      {
          respuesta.error=2
          render respuesta as JSON
      }

    }else{
    render respuesta as JSON
    }
}`
于 2019-11-07T18:22:38.883 回答