【问题标题】:Customise Laravel auth middleware自定义 Laravel 身份验证中间件
【发布时间】:2017-07-01 18:23:02
【问题描述】:

在我的users 表中,我有一列rank 对应于用户的权限。如果rank > 0,用户可以登录并继续,因为rank 中的0 意味着他们(暂时)被阻止或不活动。所以我需要定制auth 中间件,所以只有等级> 0 才会被认证。

我对此进行了一些研究,但没有找到将我的代码准确放在哪里。

编辑:我之前发现了如何手动验证具有附加要求的用户(例如rank > 0),但是,我使用的是 laravel 内置功能,所以这并没有多大帮助:

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
    // The user is active, not suspended, and exists.
}

(在这种情况下是active(来源:laravel 文档),但可以调整)。

【问题讨论】:

  • 非常感谢您在没有适当解释的情况下投票否决。谢谢,我从中学到了很多!

标签: php laravel middleware


【解决方案1】:

Illuminate\Foundation\Auth\AuthenticatesUsers 特征中有一个 credentials() 方法,您可以在 app/Http/Controllers/Auth/LoginController.php 中覆盖该方法。因此,只需将其添加到您的 LoginController:

/**
 * Get the needed authorization credentials from the request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
protected function credentials(Request $request)
{
    return [
        'email' => $request->{$this->username()},
        'password' => $request->password,
        'active' => 1, // yep, not rank, read below
    ];
}

如果排名字段的值不同于 0 和 1,请不要将其用于此目的并添加一个活动字段。否则如果你屏蔽了一个用户,也就是说你将rank字段设置为0,你怎么知道你取消屏蔽用户时的旧rank是多少?

【讨论】:

    【解决方案2】:

    您的app/http/middleware 中有一个名为RedirectIfAuthenticated 的中间件

    您必须将其编辑为如下内容:

    if (Auth::check() && Auth::user()->rank > 0) {
        return $next($request);
    }
    return redirect('/home');
    

    另外,如果你想像你写的那样手动验证用户,你可以检查用户对象上的等级和密码,然后使用

    Auth::login($user)
    

    【讨论】:

    • 感谢您的回答。但是,我的RedirectIfAuthenticated 看起来像if (Auth::guard($guard)->check()) { return redirect('/dashboard'); },所以我想知道您的解决方案究竟是如何工作的。它适用于每个页面吗?
    • 好吧,如果用户通过了身份验证,它将继续请求,如果不是,它将被重定向到 /home @FelixBlome
    猜你喜欢
    • 2015-08-02
    • 2015-02-23
    • 2014-03-30
    • 2016-04-18
    • 1970-01-01
    • 2021-02-06
    • 2020-03-11
    • 1970-01-01
    相关资源
    最近更新 更多