【问题标题】:Modify native authentication in Laravel 5.2在 Laravel 5.2 中修改原生认证
【发布时间】:2016-04-23 12:43:06
【问题描述】:

我在 Laravel 5.2 中使用开箱即用的身份验证(使用工匠命令 make:auth)。它就像一个魅力。

问题是,我想限制只有活动用户的登录(deleted_at = NULL)。

但是,当使用软删除时,我无法使用 user_id 外键检索其他模型(尽管用户已被删除,但我仍然必须访问用户信息)。

什么是好的方法?

我想出的另一种方法是使用“活动”布尔列而不是“deleted_at”日期列。这样,我可以只过滤具有“active”=TRUE 的用户,并且外键没有问题。

在这种情况下,我如何才能限制用户仅在“活动”设置为 TRUE 时才能登录?

干杯!

【问题讨论】:

  • 我不明白您为什么希望另一列模仿deleted_at 列,您的理由似乎没有多大意义。
  • 如果我使用 deleted_at 列软删除,在检索附加到“用户”的其他模型时,我无法检索用户。或者我可以吗?那太好了
  • 你有雄辩的withTrashedonlyTrashed 方法来确保你得到删除项目或只删除项目的结果。这些应该可以很好地满足您的目的。然后您可以使用trashed 方法来检测模型是否已被软删除。
  • 在引用其他模型的用户时(例如,从国家/地区的角度查询所有活动和非活动用户时),我可以使用 withTrashed 吗?回到最初的问题:只有“deleted_at”用户才能登录吗?

标签: laravel authentication laravel-5.2


【解决方案1】:

您始终可以将任何额外参数传递给Auth::attempt() 方法,如下所示:

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
    // Redirect to required route/url
}

据我了解,您也可以对 deleted_at 字段执行类似操作。

【讨论】:

    【解决方案2】:

    Laravel 用于在控制器中进行身份验证的 trait 有一个 handleUserWasAuthenticated() 方法。它检查另一个名为authenticated()(默认情况下未定义)的方法,并在完全验证用户并让他们访问您的应用程序之前调用该方法。因此,如果您在自己的 AuthController 中定义此方法,则可以进行任何身份验证后检查,例如用户是否处于活动状态。

    class AuthController
    {
        public function authenticated($request, $user)
        {
            if (! $user->is_active) {
                // Throw exception, display error etc.
            }
    
            return redirect()->intended($this->redirectPath());
        }
    }
    

    【讨论】:

      【解决方案3】:

      在Auth\AuthController.php中,添加authenticated()函数

      use Auth;
      class AuthController extends Controller
      {
          .
          .
          .
      
          public function authenticated($request, $user) {
                  if (! $user->active) {
                      Auth::logout();
                      return redirect('login')->withErrors([
                          $this->loginUsername() => 'Your '.$this->loginUsername().' is not active. Please contact Administrators'
                      ]);
                  }else {
                      return redirect()->intended($this->redirectPath());
                  }
          }
      

      【讨论】:

        猜你喜欢
        • 2016-08-29
        • 2017-01-08
        • 2016-06-23
        • 2016-06-11
        • 2016-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多