检查密码是否存在

时间:2015-10-28 07:37:58

标签: php laravel laravel-5 eloquent laravel-5.1

我正在使用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!!!
    }
}

缩短

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

现在我想查看某个药房是否有“某些密码”的帐户密码,以便我需要检查属于某个药剂师的所有帐户,并且该药房属于某个药房

2 个答案:

答案 0 :(得分:2)

  

客户希望它有1个药房,所有药剂师都会使用1个帐户。识别这位药剂师的唯一方法是通过他们的密码/密码。

直言不讳地说:那简直是愚蠢的。

密码是只有帐户持有人知道的秘密。没有人应该知道密码。甚至不是服务器的所有者。这就是为什么你无法挽回哈希和盐密码而不留下明文密码的痕迹。密码仅用作 验证 ,以证明用户的 身份

流程是:

  1. 用户声称是" X" (同一性)
  2. 服务器问"如果您真的是X,秘密是什么?"
  3. 用户使用其密码
  4. 证明他们的身份

    您正在做的是将其减少为一个标识符。用户只是声称自己是" Bob"只要有一个" Bob"在你的数据库中,你让他们通过。但另外,你可以用技术最落后的方式做到这一点。

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

    这就是为什么可索引的,可知的,可重复删除的 id 与秘密证明之间的区别。

    周围的好主意。

答案 1 :(得分:0)

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

return [

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