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 活跃成员的主要内容,如果未能解决你的问题,请参考以下文章