2016-06-10 114 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