Laravel 5 - 更改默认登录操作

Posted

技术标签:

【中文标题】Laravel 5 - 更改默认登录操作【英文标题】:Laravel 5 - change default login action 【发布时间】:2015-11-09 05:18:19 【问题描述】:

我正在使用 Laravel 5.0 内置的身份验证控制器。但是,除了身份验证之外,我还想在登录期间添加一些操作,例如更新另一个表。不过,我似乎找不到应该在哪里编写这样的代码。

为了注册,我在“Services”文件夹下的“Registrar.php”文件中添加了我想要的内容。我怎样才能为登录做到这一点?

提前致谢。

【问题讨论】:

【参考方案1】:

您可以将以下函数放入 AuthController.php 以覆盖 AuthenticatesAndRegistersUsers 特征的默认函数。您可以根据需要更改它。

/**
 * Handle a login request to the application.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function postLogin(Request $request)

    $this->validate($request, [
        'email' => 'required|email', 'password' => 'required',
    ]);
    $credentials = $request->only('email', 'password');
    if ($this->auth->attempt($credentials, $request->has('remember')))
    
        return redirect()->intended($this->redirectPath());
    
    return redirect($this->loginPath())
                ->withInput($request->only('email', 'remember'))
                ->withErrors([
                    'email' => $this->getFailedLoginMessage(),
                ]);

【讨论】:

从特征复制代码不是最好的选择。特征中的身份验证逻辑可能会在未来的版本中发生变化,并且不会反映在您的代码中。当用户通过身份验证时,Laravel 会触发事件,这些事件应该用于将身份验证逻辑与需要运行的其他操作分开。 在答案中查看身份验证事件的示例用法 @jedrzej.kurylo 同意。我完全忘记了事件。事件是挂钩代码的更好地方。投票赞成。 @pinkalvansia 感谢您抽出宝贵时间回答。【参考方案2】:

Laravel 的身份验证层会在发生不同的身份验证相关操作时触发多个事件:

auth.attempt - 当用户尝试进行身份验证时 auth.login - 当用户认证成功时 auth.logout - 用户注销时

您可以侦听这些事件(在您的情况下为 auth.login)并应用必要的操作,而无需从特征复制代码,如果发生一些更改,您可以手动更新代码身份验证有效。

首先,你需要创建一个监听类:

class AuthLoginHandler 
  public function handle(User $user, $remember) 
    // do whatever you need to do after user authenticates
  

然后在你的 EventServiceProvider 类中注册监听器:

protected $listen = [
  'auth.login' => [
        AuthLoginHandler::class
    ],
];

现在,每次用户进行身份验证时都会调用处理程序的 handle() 方法,即使您有多个针对不同用户类型的登录表单,甚至是表单以外的其他一些身份验证形式。

你可以在这里阅读更多关于 Laravel 事件的信息:http://laravel.com/docs/5.1/events#defining-listeners

【讨论】:

感谢您抽出宝贵时间回答。我应该把那个监听器类放在哪里?任何特定的 laravel 文件夹? 任何你喜欢的地方,只要命名空间匹配目录结构,以便它可以自动加载。在文档中,他们将侦听器放在 app/Listeners 中,因此您也可以这样做 任何想法为什么AuthLoginHandler@handle 方法在登录时没有被触发?我按照答案中的描述做了所有事情,但是登录后方法没有执行。我希望我在这里遗漏了一些基本的东西。 (Laravel 5.2)

以上是关于Laravel 5 - 更改默认登录操作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 5 中更改默认重置密码链接

在 Lumen 或 Laravel 5 中更改时区

将数组从 AuthController 传递到 Laravel 5 中的登录视图

更改 Laravel 中的默认登录路由

Larave中CSRF攻击

如何更改默认的Laravel Auth登录视图