我有一个帐户电子邮件确认我的Laravel应用程序,然后我想检查用户何时尝试登录,如果用户已激活他的帐户。
我有一个自定义模型函数isActivated,只返回用户模型上的状态attibute(boolean类型,在西班牙语中命名为estado)。
在我的用户模型上:
public function isActivated()
{
return $this->estado;
}
我创建了我的中间件类似上面提供的链接建议,然后我在App / Http / Kernel.php中注册为中间件路由
当我将中间件分配给我的路由时(而不是在我的控制器中创建构造函数,我希望这个中间件只是在登录控制器的post请求上),问题就来了。
当我尝试登录时抛出错误:
Fatal Throwable Error:
Fatal Error: Call to a member function isActivated() on null
我的中间件看起来很像链接
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Contracts\Auth\Guard;
class RedirectIfNotMailActivated
{
/**
* The Guard implementation.
*
* @var Guard
*/
protected $auth;
/**
* Create a new filter instance.
*
* @param Guard $auth
* @return void
*/
public function __construct(Guard $auth)
{
$this->auth = $auth;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ( ! $this->auth->user()->isActivated()) {
return redirect('/login')
->with('mensaje',
'¡Lo sentimos, no ha confirmado su cuenta aún!');
} else {
return $next($request);
}
}
}
有趣的部分:如果我在App / Http / Middleware / Authenticate(auth中间件)中添加我的中间件的句柄功能的内容,然后我将一些路由分组并附加到此中间件,这可以按预期工作(不是允许未确认的用户登录)
问题是我在用户表中为用户类型(管理员和客户)建立了一个polimorphic关系,所以我将管理员控制面板连接到auth中间件并将其分组,因为我需要为经过身份验证的用户重新设置对控制面板的访问权限。管理员类型(不允许客户用户类型)。
限制仅适用于管理员用户类型。
并且coursethis允许客户用户类型可以登录,因为如果他的帐户被确认,我什么也没有。
我做错了什么... isActivated模型函数在auth中间件中添加时工作正常,但是当我在自定义中间件中使用相同的方法时没有。
...谢谢
EDITED
我的中间件已归为我登录控制器的post方法
Route::post('/login', [
'middleware' => 'activated.email',
'uses' => 'loginController@store'
]);
PD:对不起长篇文章和糟糕的英语习惯,这不是我的第一语言:(
答案 0 :(得分:0)
您的逻辑存在问题。您的登录路径不应该被我激活的用户保护,因为中间件在请求之前执行,因此用户无法尝试登录您的案例并因此而导致错误。
您可以执行的操作是在验证中间件中添加isActivated()
支票,这样您就会有一个已登录的用户并且$this->auth->user()
赢得了&#39; t为空。