2016-06-10 4 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, что только возвращает состояние (булево атрибут объявления типа, названный Estado на испанском языке) на модели пользователя.

На моей модели пользователя:

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

Я создал промежуточное программное обеспечение подобное, как по ссылке выше предоставленных советов, то я зарегистрирован в App/Http/Kernel.php в качестве промежуточного маршрута

Проблема возникает когда я назначаю свое промежуточное ПО на свой маршрут (вместо создания функции construct в моем контроллере, я хочу, чтобы это промежуточное программное обеспечение было только после запроса контроллера входа).

Когда я попытался войти в систему выдает ошибку:

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); 
    } 
} 
} 

забавная часть: если я добавляю содержание функции ручки моего промежуточное программное обеспечение в приложении/Http/Middleware/Authenticate (auth middleware), а затем я группирую и прикрепляю некоторые маршруты к этому промежуточному программному обеспечению, это работает как ожидалось (не позволяя не подтвержденным пользователям входить в систему)

Проблема заключается в том, что у меня есть полиморфическая связь в таблице пользователей для типа пользователя (Admin и Customer), поэтому я привязал и сгруппировал панель управления админами с промежуточным ПО промежуточного уровня, потому что мне нужно ограничить доступ к панели управления только для аутентифицированных пользователей и типа администратора (не допускается для типа пользователя клиента).

Ограничение принимает участие только в отношении типа администратора.

И из coursethis позволяют пользователям пользовательских типов войти в систему, потому что у меня нет ничего, что ограничивало бы, если его учет подтвержден или нет.

Что я делаю неправильно ... Функция isActivated model работает нормально, когда добавляется в промежуточное ПО auth, но нет, когда я использую этот же подход в своем обычном промежуточном программном обеспечении.

Спасибо ....

РЕДАКЦИЯ

Моего промежуточный asigned моего метод поста для моего контроллера входа

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

PD: извините за длинный пост и плохого английского habilities, его это не мой первый язык :(

+0

Можете ли вы вставить, как назначить это промежуточное ПО на свой маршрут? – TheFallen

+0

Конечно, я редактировал мой пост, добавляя определение маршрута :) @TheFallen – elotgamu

ответ

0

У вас проблемы с нашей логикой. login Путь не должен быть защищен активированным пользователем, потому что промежуточное программное обеспечение выполняется перед запросом, поэтому пользователь не может попытаться выполнить вход в ваш случай и вы получите ошибку из-за этого.

Что вы можете сделать вместо этого добавить isActivated() чек в Аутентифицировать промежуточного слоя, так что вы будете иметь авторизованного пользователя и $this->auth->user() не будет нулевым.

+0

Спасибо !!! Прочитав некоторые документы, я понял, что ты прав !!! – elotgamu

+0

Но, честно говоря, я не хочу добавлять свою активированную проверку в промежуточное ПО auth, потому что я использую это промежуточное программное обеспечение и другое промежуточное программное обеспечение, которое я создал, чтобы вытеснить доступ к доступу к панели управления администратора. Поэтому, если пользователь, который пытается войти в систему, не использует тип администратора, он добился успеха при входе в систему, потому что ничего не проверяет его аутентификацию, что его учетная запись еще не подтверждена. – elotgamu

+0

Другой aprroach, который я получаю, находится в моем методе post на контроллере входа в систему, когда я проверяю Auth :: attemp. Затем я проверил, если! Auth :: user() -> isActivated an, если его возвращает false, я выхожу из него немедленно и перенаправляю логин. Я знаю эту звуковую плохую практику, я предпочитаю реализовать middleare только для этого, но middleare Approac не работает ... – elotgamu

 Смежные вопросы

  • Нет связанных вопросов^_^