使用Laravel 5上的默认身份验证检查登录时的其他列

时间:2015-04-26 03:25:29

标签: php laravel-5

这是我第一次尝试使用php框架,所以我决定使用Laravel 5。

但是我有一个问题:我想在登录时检查用户状态,因此只有enabled == 1个用户才能登录。我检查了 AuthenticatesAndRegistersUsers.php ,并关注了 Guard.php 上的一些函数,但我无法理解它在哪里检查实际列,以及我应该在哪里检查专栏is_enabled

3 个答案:

答案 0 :(得分:1)

有些人可能不同意我的意见,但我会制作自己的Auth Controller。默认的一个太模糊了。如果你想要,你可以删除带有php artisan fresh的laravel附带的所有东西,这将删除Auth Controller和其他一些东西。

自己创建非常简单,登录方法看起来像这样:

public function login(Request $request)
{
    $credentials = $request->only('email', 'password');
    $remember = $request->get('remember') == 'on' ? true : false;

    if(\Auth::attempt($credentials, $remember)) {
        $enabled = \Auth::user()->enabled;

        if(!$enabled) {
            \Auth::logout();
            return redirect()->withMessage('User not enabled to login');
        }
    }
}

检查文档以了解其他身份验证功能:

http://laravel.com/docs/5.0/authentication

您还可以在尝试之前检查数据库中的用户:

$enabled = User::where('email', '=', $email)->first()->enabled;
if($enabled && \Auth::attempt($credentials, $remember)) {
   ... redirect to logged in page.

答案 1 :(得分:0)

根据this链接的引用,假设在登录期间是否需要检查批准的另一列,那么需要在loginController中添加以下功能

 public function credentials(Request $request)
    {
        $credentials = $request->only($this->username(), 'password');
        $credentials = array_add($credentials, 'approved', '1');
        return $credentials;
    }

答案 2 :(得分:0)

您可以在默认的LoginController中使用经过身份验证的方法。每当用户通过配置的身份验证保护时,就会调用此方法。

  /**
   * The user has been authenticated.
   *
   * @param  \Illuminate\Http\Request  $request
   * @param  mixed  $user
   * @return mixed
   */
  protected function authenticated(Request $request, $user)
  {
      // custom logic
      if ($user->isDisabled()) {
          $logoutResponse = $this->logout($request);

          if ($logoutResponse instanceof RedirectResponse) {
              $logoutResponse->withErrors(__('users.Your account has been deactivated'));
          }

          return $logoutResponse;
      }
      // end custom logic

      return null;
  }

通过检查AuthenticatesUsers特征形式Laravel,可以很清楚地看到,此方法的返回值用于if语句中,因此当我们想要默认行为时,只返回null是可以的:

  /**
   * Send the response after the user was authenticated.
   *
   * @param  \Illuminate\Http\Request  $request
   * @return \Illuminate\Http\Response
   */
  protected function sendLoginResponse(Request $request)
  {
      $request->session()->regenerate();

      $this->clearLoginAttempts($request);

      if ($response = $this->authenticated($request, $this->guard()->user())) {
          return $response;
      }

      return $request->wantsJson()
                  ? new Response('', 204)
                  : redirect()->intended($this->redirectPath());
  }