我正在使用laravel 5.1。现在我想检查是否已在数据库中定义了某个密码。这是我的数据库架构
/ *帐户表* /
Schema::create('accounts', function (Blueprint $table) {
$table->increments('id');
$table->integer('pharmacist_id')->unsigned()->index();
$table->foreign('pharmacist_id')->references('id')->on('pharmacists')->onDelete('cascade');
$table->string('username')->unique();
$table->string('password', 70);
$table->string('rights');
$table->rememberToken()
$table->timestamps();
});
/ *药剂师表* /
Schema::create('pharmacists', function (Blueprint $table) {
$table->increments('id');
$table->integer('pharmacy_id')->unsigned()->index();
$table->foreign('pharmacy_id')->references('id')->on('pharmacies')->onDelete('cascade');
$table->string('fname');
$table->string('mname');
$table->string('lname')
$table->date('bdate');
$table->string('email');
$table->string('contact');
$table->timestamps();
});
现在我想要的是检查某个药房中是否已经定义了某个密码_它看起来像这样
$accounts = Account::whereHas('pharmacist', function($query) {
return $query->where('pharmacy_id', Auth::user()->id);
})->where('password', $password)->get();
但似乎密码只是作为纯文本传递而未加密。我也尝试使用这种方法
where('password', bcrypt($password))
where('password', Hash::make($password))
where('password', Crypt::encrypt($password))
但这一切都无效。任何解决方案?我正在考虑这样的事情,我不确定这是否可能
$is_valid = Auth::validate(array('pharmacist.pharmacy_id' => Auth::user()->id, 'password' => $value));
因为如果我使用下面的代码,我可以检查用户是否输入了有效密码。
$is_valid = Auth::validate(array('id' => Auth::user()->id, 'password' => $value));
使用Auth::validate
检查用户名和密码是否匹配很容易,但所需的检查是检查某位药剂师是否已输入此特定密码。所以基本上它有点像在所有帐户中循环,并检查他们的密码是否与此特定密码相同。
这是我到目前为止所做的,但这有一些问题。如果某个药房有1000+用户,那么这将循环1000x,这是未优化的,不是一个好的解决方案
$accounts = Account::whereHas('pharmacist', function($query) {
return $query->where('pharmacy_id', Auth::user()->id);
})->get();
foreach($accounts as $account) {
if (Hash::check($value, $account->password)) {
// FOUND!!!
}
}
缩短
药房有很多药剂师 药剂师有一个帐户现在我想查看某个药房是否有“某些密码”的帐户密码,以便我需要检查属于某个药剂师的所有帐户,并且该药房属于某个药房
答案 0 :(得分:2)
直言不讳地说:那简直是愚蠢的。客户希望它有1个药房,所有药剂师都会使用1个帐户。识别这位药剂师的唯一方法是通过他们的密码/密码。
密码是只有帐户持有人知道的秘密。没有人应该知道密码。甚至不是服务器的所有者。这就是为什么你无法挽回哈希和盐密码而不留下明文密码的痕迹。密码仅用作 验证 ,以证明用户的 身份 。
流程是:
您正在做的是将其减少为一个标识符。用户只是声称自己是" Bob"只要有一个" Bob"在你的数据库中,你让他们通过。但另外,你可以用技术最落后的方式做到这一点。
这也意味着每个用户都必须拥有唯一的密码。如果用户选择已存在的密码,则您必须拒绝该密码,告知用户选择其他密码。这向用户发出信号,表明其他人正在使用此密码,并且他们已经猜到了其他人的密码并且可以冒充他们。
这就是为什么可索引的,可知的,可重复删除的 id 与秘密证明之间的区别。
周围的好主意。
答案 1 :(得分:0)
创建自己的Request类(这是关于https://laracasts.com/series/laravel-5-fundamentals/episodes/12的教程) 在请求类中,您可以使用 类似的东西
return [
'password' => 'required|confirmed|min:6|unique:users', ]