检查密码是否存在


Check if Password exists

我使用的是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();
});

现在我想检查的是,某个密码是否已经在某个制药id中定义,它看起来像这个

$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!!!
    }
}

缩短

药房有很多药剂师药剂师有一个账户

现在我想检查某个药房是否有"特定密码"的帐户密码,所以我需要检查属于某个药剂师的所有帐户,并且该药房属于某个药房

客户希望它有一个药房,所有药剂师将使用一个帐户。唯一能识别这位药剂师的是他们的密码/PIN。

坦率地说:这太愚蠢了。

密码是一个只有账户持有人知道的秘密。其他人不应该知道密码。甚至连服务器的所有者都没有。这就是为什么你对密码进行无可挽回的散列和salt处理,以不留下明文密码的痕迹。密码仅用于验证,以证明用户的身份。

流程为:

  1. 用户声称自己是"X"(身份)
  2. 服务器问"如果你真的是X,秘密是什么?"
  3. 用户用他们的秘密密码证明他们的身份

您正在做的是将其简化为一个标识符。用户只是声称自己是"Bob",只要你的数据库中有"Bob"就可以让他们通过。但除此之外,你做这件事的方式在技术上是最落后和最慢的。

这也意味着每个用户都必须有一个唯一的密码。如果用户选择了一个已经存在的密码,您将不得不拒绝该密码,并告诉用户选择其他密码。这向用户发出信号,表明其他人正在使用此密码,并且他们刚刚猜到了其他人的密码,可以冒充他们。

这就是为什么在可索引、可知道、可重复的id和秘密证明之间存在区别。

到处都是坏主意。

创建您自己的Request类(下面是关于它的教程https://laracasts.com/series/laravel-5-fundamentals/episodes/12)在请求类中,您可以使用类似的东西

return [
        'password' => 'required|confirmed|min:6|unique:users', ]