因此,我使用bcript
和has_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>
。
如何正确执行此操作?
答案 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
实例需要在左侧。