Laravel 5 Auth 活跃成员

Posted

技术标签:

【中文标题】Laravel 5 Auth 活跃成员【英文标题】:Laravel 5 Auth active members 【发布时间】:2016-10-12 15:35:48 【问题描述】:

有几个类似的问题,但似乎都不完整,因为它们指的是不存在的功能。

我指的是:

Check for active user state with laravel

Login only if user is active using Laravel

extend laravel 5 built-in authentication to login only "if user == active"

在所有这些解决方案中,都提供了主要用于更改 AuthController 中的功能的解决方案,但是这些功能不存在。

我使用的是最新版本的 Laravel (5.2),所以我提到的默认文件如下所示:https://github.com/laravel/laravel/blob/master/app/Http/Controllers/Auth/AuthController.php

现在,我该如何实现这个功能?我尝试将public function postLogin()(如其他提到的帖子中所建议的那样)复制到该AuthController 文件中。没有改变。

我显然在这里遗漏了一些东西。

请人帮忙!

编辑: 我添加的功能是:

public function postLogin(Request $request)

$this->validate($request, [
    'email' => 'required|email', 'password' => 'required',
]);

$credentials = $this->getCredentials($request);

// This section is the only change
if (Auth::validate($credentials)) 
    $user = Auth::getLastAttempted();
    if ($user->active) 
        Auth::login($user, $request->has('remember'));
        return redirect()->intended($this->redirectPath());
     else 
        return redirect($this->loginPath()) // Change this to redirect elsewhere
            ->withInput($request->only('email', 'remember'))
            ->withErrors([
                'active' => 'You must be active to login.'
            ]);
    


return redirect($this->loginPath())
    ->withInput($request->only('email', 'remember'))
    ->withErrors([
        'email' => $this->getFailedLoginMessage(),
    ]);


【问题讨论】:

如果您使用Route::auth() 为Auth 注册路由,则该方法不是postLogin 而是login,请检查您的路由。 好的,我已将函数从postLogin 重命名为login。我有一个关于Request 的异常,我必须添加use Illuminate\Http\Request。现在我得到另一个例外:Class 'App\Http\Controllers\Auth\Auth' not found 这是一个 PHP 命名空间问题。 在此行触发:if (Auth::validate($credentials)) 来自问题中编写的代码。好像我不能在这里使用门面。 这是一个命名空间问题。您必须指示 PHP 该类不在当前命名空间中。如果您需要对命名空间的简要介绍,请查看这篇文章:https://mattstauffer.co/blog/a-brief-introduction-to-php-namespacing 【参考方案1】:

AuthController 中的大部分功能都是使用traits 添加的。请注意课程开头的这一行:

use AuthenticatesAndRegistersUsers, ThrottlesLogins;

如果您查看AuthenticatesAndRegistersUsers,您会发现它确实有一个 postLogin 方法。

至于为什么实现此方法不起作用:我认为您在方法签名中缺少$request 参数。

如果不是这种情况,请在您的问题中添加更大的代码 sn-p。

编辑:为了将来的调试:php artisan route:list 为您提供了哪些路由调用哪些方法的列表。这可以提示您要覆盖哪个方法。

【讨论】:

所以你是说我应该从AuthenticatesAndRegistersUsers 更新函数? 不,您应该在AuthController 中覆盖它(应该可以)。 AuthenticatesAndRegistersUsers 位于您的供应商目录中的某个位置,您不应触摸该目录,因为更改会立即被作曲家覆盖。 AuthController 是您项目的 Controllers 目录中的一个不错的类,我认为它适用于这种适应。只需从AuthenticatesAndRegistersUsers 复制方法签名(或者可能是整个方法)。 没错!我已经用我添加的功能更新了我的问题。除此之外,我还在AuthController 文件的顶部添加了Use Request;。仍然没有弄清楚为什么不起作用。 不要添加use Request 那是门面,而不是实际的请求类。 无论有没有Use Request,它仍然无法正常工作。而且也没有引发任何异常。【参考方案2】:

所以,对于在 Laravel 5.2 上遇到同样问题的每个人,使用 php artisan make:auth 提供的身份验证。

首先重要的是要了解Route::auth(); 指向login 函数而不是postLogin(谢谢@lagbox!)

那你就得更新AuthController:

在文件顶部添加:

use Auth;
use Illuminate\Http\Request;

use AuthenticatesAndRegistersUsers, ThrottlesLogins; 之后添加:

/**
 * Where to redirect users if login is unsuccessufull.
 *
 * @var string
 */
protected $loginPath = '/login';`

以及更新的login函数:

public function login(Request $request)

$this->validate($request, [
    'email' => 'required|email', 'password' => 'required',
]);

$credentials = $this->getCredentials($request);

// This section is the only change
if (Auth::validate($credentials)) 
    $user = Auth::getLastAttempted();
    if ($user->active) 
        Auth::login($user, $request->has('remember'));
        return redirect()->intended($this->redirectPath());
     else 
        return redirect($this->loginPath) // Change this to redirect elsewhere
            ->withInput($request->only('email', 'remember'))
            ->withErrors([
                'active' => 'You must be active to login.'
            ]);
    


return redirect($this->loginPath)
    ->withInput($request->only('email', 'remember'))
    ->withErrors([
        'email' => $this->getFailedLoginMessage(),
    ]);


然后login.blade.php 应该更新以显示新的错误@if ($errors->has('active'))

谢谢大家的帮助!

【讨论】:

我只是想在 Laravel 5.1 中添加 postLogin

以上是关于Laravel 5 Auth 活跃成员的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 Auth 登录有效,Auth::check 失败

Laravel 5 Auth - 用户自定义表

Laravel 5.2.29 multiauth 使用 Auth::guard('one'),Auth::guard('two')

Auth::check() 不持久 Laravel 5.2

laravel 5.4 auth 外观不起作用

异常页面(布局)上的 Laravel 5.2 Auth::check()