2016-06-10 115 views
0

我有我的Laravel应用程序的帐户电子邮件确认,然后我想检查用户尝试登录时,如果用户已激活他的帐户。自定义中间件检查模型自定义函数返回值的错误自定义函数Laravel 5.1

我发现这一点:https://laracasts.com/discuss/channels/general-discussion/how-to-test-if-a-user-which-tries-to-log-in-is-confirmed-yet

我有一个自定义模式功能isActivated只返回用户模式的状态attibute(布尔型,西班牙文命名的国家体制)。

在我的用户模型:

public function isActivated() 
{ 
    return $this->estado; 
} 

我创建为提供建议上面的链接类似我的中间件,然后我在app/HTTP/Kernel.php注册为中间件路线

问题来了当我将中间件分配给我的路由(而不是在我的控制器中创建构造函数时,我只需要在登录控制器的发布请求中使用此中间件)。

当我试图登录抛出一个错误:

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中间件)中的中间件,然后我将一些路由分组并附加到这个中间件,这按预期工作(不允许未确认的用户登录)

问题是,我在用户表中为用户类型(管理员和客户)设置了多态关系,因此我将管理控制面板连接并分组为auth中间件,因为我需要将控制面板的访问权限仅用于已认证的用户和管理员类型(不允许客户用户类型)。

仅限管理员用户类型的限制。

而coursethis让客户用户类型可以登录,因为如果他的帐户被确认或没有,那么我没有任何活动。

我在做什么错误...当在auth中间件中添加isActivated模型函数时可以正常工作,但在我的自定义中间件中使用这种方法时没有问题。

感谢....

EDITED

我中间件asigned我的帖子方法为我登录控制器

Route::post('/login', [ 
     'middleware' => 'activated.email', 
     'uses' => '[email protected]' 
]); 

PD:对不起长的帖子和英语不好habilities,它是不是我的第一语言:(

+0

你可以粘贴你如何分配这个中间件到你的路线? – TheFallen

+0

当然,我编辑了我的帖子,添加了路线定义:) @TheFallen – elotgamu

回答

0

您有我们的逻辑问题。您的登录路径不应该被激活的用户保护,因为中间件是在请求之前执行的,所以用户无法事件尝试登录您的情况,并因此导致错误。

你可以做的反而是增加的身份验证中间件你isActivated()检查,所以你将有一个登录用户和$this->auth->user()将不能为空。

+0

谢谢!阅读了一些文档后,我确实意识到你是对的! – elotgamu

+0

但是说实话,我不想将我的激活检查添加到auth中间件,因为我使用此中间件和其他中间件创建了用于响应管理控制面板路由访问的访问。因此,如果尝试登录的用户不是管理员类型用户,则他在登录时成功,因为没有对他的身份验证进行检查,因此企图确定他的帐户尚未确认。 – elotgamu

+0

当我检查Auth :: attemp时,我得到的其他犯罪是在我的登录控制器的post方法,然后检查是否! Auth :: user() - > isActivated一个,如果它返回false我立即登出并重定向lo登录表单。我知道这听起来很糟糕的做法,我宁愿为此执行一个中间值,但中间程序正在失败... – elotgamu