使用password_digest rails时检查密码

时间:2018-10-25 06:30:23

标签: ruby-on-rails authentication ruby-on-rails-5

因此,我使用bcripthas_secure_password gem在我的rails API上实现了身份验证系统。因此,我在用户模型中添加了password_digest,并且在创建新用户时,它在数据库中具有def update_password @user = User.find(params[:id]) if params[:password][:oldPassword] === @user.password if @user.update(password: params[:password][:newPassword]) render json: @user else render json: @user.errors, status: :unprocessable_entity end else render json: {erreur: "the current password is wrong"}, status: :unprocessable_entity end end 属性。

我现在正在为最终用户提供更改其密码的可能性。出于安全原因,我想询问旧密码,检查提供的旧密码是否正确,如果是,请更新用户密码。否则,发送错误消息。

这就是我写的:

params[:password][:oldPassword] === @user.password

我的问题是:false不能检查当前密码的有效性:它将始终返回<!Doctype html> <html> <head> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script> <link rel="stylesheet" href="css\font-awesome.min.css"> <title>Welcome to Login</title> <link rel="stylesheet" type="text/css" href="css\style.css"> </head> <body> <div class="container-fluid"> <div class="row"> <img class="bgimg" src="images\bg5.jpg" /> <div class="lgform"> <div class="lglogo col-md-12"> <font class="col-md-6" face="Times New Roman" size="48px">MAS</font> <img class="logo col-md-6" src="images\logo2.png" /> </div><br><br><br> <div> <i class="fa fa-id-card col-md-2" style="font-size:20px;color:green"></i> <select class="col-md-9"> <option>Select a Document</option> <option>id number</option> </select> </div><br> <div> <i class="fa fa-user-o col-md-2" style="font-size:20px;color:green"></i> <input class="col-md-9" type="number" placeholder="Number Document" /> </div><br> <div> <i class="fa fa-key col-md-2" style="font-size:20px;color:green"></i> <input class="col-md-9" type="password" placeholder="Password" /> </div><br> <div> <center> <a href="index.html"> <input class="btn btn-primary col-md-6" type="submit" value="LOGIN" style="font-weight:bold" /> </a> </center> <center> <a href="registration.html"> <br><input class="btn btn-danger col-md-6" type="submit" value="Create an Account! New User?" style="font-weight:bold" /> </a> </center> </div><br> <div class="col-md-7" style="margin-left:100px"> <a href="forgotpsw.html">¿Forgot Password?</a> <a href="help.html" style="float:right">¿Help?</a> </div><br><br> </div> <footer> <div class="container-fluid"> <div class="row"> <div class="float-left" style="position:relative"> <p class="p1 col-lg-6">(91)+8313285202</p><br> <h5><i class="fa fa-phone-square col-lg-6" style="color:red">EMERGENCY CONTACT</i></h5> </div> <br><br> <div class="float-right" style="position:relative"> <p class="p2 col-lg-6">(91)+MAS@GMAIL.COM</p><br> <h5><i class="fa fa-check col-lg-6" style="color:green">ONLINE CONSULTANT</i></h5> </font> </div> </div> </div> </footer> </div> </div> </body> </html>

如何正确执行此操作?

3 个答案:

答案 0 :(得分:1)

有一种方法user.authenticate(pass)

答案 1 :(得分:1)

您正在将密码类型与摘要哈希进行比较,这导致其始终返回false。 也就是说,用户键入他的旧密码“ 123456”,但系统无法访问该字符串,当它查询数据库时,它返回类似“ $ 2a $ 12 $ .FMAPyhKwOyg.bHti8aFzuOcBw1w2ho1HI5IOloa4vlSMnAMMNtJC”的信息。这就是由加密造成的安全措施。 要检查它,必须使用.authenticate(:password)方法,它将“ 123456”加密为一个哈希,然后将其与数据库匹配。

答案 2 :(得分:0)

也许不是您要找的东西,但是几个月前我遇到了类似的问题,一种正确比较这些密码的解决方案是使用bcrypt,如下所示:

BCrypt::Password.new(new_password) == (user.password)

表达式中元素的顺序很重要,因为Rails设置了正确的比较器,这意味着bcrypt实例需要在左侧。