Laravel 5 - 针对两个表

时间:2017-01-29 19:04:39

标签: authentication laravel-5.3

我对Laravel有点新鲜,并且遇到了以我想要的方式验证用户的问题。我目前在我的数据库中有一个用户表和公司表。

我见过很多基于用户是否是管理员使用gaurds对多个表进行身份验证的示例,但我希望通过以下方式对所有用户进行身份验证:

  1. 用户的emailpassword匹配(用户表中的字段)
  2. 用户的status当前处于活动状态(用户表中的字段)
  3. 用户属于有效status公司(公司表中的字段)

1 个答案:

答案 0 :(得分:0)

自我发布此问题以来,我一直在尽可能地进行研究,最终得到了满意的解决方案。我不确定这是否是最干净的方式,但它对我有用。如果其他人可以从中受益,这里是我采取的步骤:

1)我将以下代码添加到app\User.php模型:

   # company / user relationship
   public function company() {
      return $this->belongsTo('App\Company', 'comp_id');
   }

   # determine if company is active
   public function activeCompany() {
      $comp_stat = $this->company()->first(['status'])->toArray();

      return ($comp_stat >= 1) ? true : false;
   }

然后,我使用以下内容修改了app\Http\Middleware\Authenticate.php中的句柄方法:

   public function handle($request, Closure $next, $guard = null) {
      if (Auth::guard($guard)->guest()) {
         if ($request->ajax() || $request->wantsJson()) {
            return response('Unauthorized.', 401);
         } else {
            return redirect()->guest('login');
         }
      }

      /* begin modified section */

      if (Auth::check()) {
         # logout if company is inactive
         if (!auth()->user()->activeCompany()) {
            Auth::logout();
            return redirect()->guest('login')->with('comp-status-error', true);
         }

         # logout if user is inactive
         if (auth()->user()->status != 1) {
            Auth::logout();
            return redirect()->guest('login')->with('user-status-error', true);
         }
      }

      /* end modified section */

      return $next($request);
   }

因此,从技术上讲,用户已经在公司和用户状态检查之前进行了身份验证,这就是您必须手动调用Auth::logout()的原因。这也是它感觉有点“肮脏”的原因。对我来说,但是,再说一遍,我无法找到任何其他方式,所以我必须做有效的工作!如果他们看到更好的方法来实现这一点,我鼓励任何人发表评论。