在 Laravel 5.2 中修改原生认证

Posted

技术标签:

【中文标题】在 Laravel 5.2 中修改原生认证【英文标题】:Modify native authentication in 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”用户才能登录吗? 【参考方案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());
            
    

【讨论】:

以上是关于在 Laravel 5.2 中修改原生认证的主要内容,如果未能解决你的问题,请参考以下文章

Git克隆的laravel 5.2项目不会迁移

Laravel 5.2 用户认证,怎样用Flash Message显示错误信息

Laravel 5.2服务----用户验证Auth相关问题

Laravel 5.2 在同一页面上登录和注册表单

当我在 Laravel 5.2 中进行身份验证时,我无法访问关于页面

我是laravel小白,5.2我修改app.blade.php这类系统原来就有的视图,一直无效