2016-09-29 4 views
0

Я хочу выполнить аутентификацию с помощью токена в любом URL-адресе. Эта аутентификация вызывается перед маршрутами, а токен хранится в таблице пользователей (поле token).Authenticate user on constructor

При обращении к URL mysite.com/backend/?token=XXX&anyparam=any, если токен действителен, пользователь должен быть перенаправлен на mysite.com/backend/?anyparam=any.

Я пытаюсь выполнить аутентификацию на конструкторе контроллера, поэтому, если у URL-адреса есть действительный токен (соответствующий токену пользователя), пользователь должен пройти аутентификацию.

public function __construct(Request $request) 
{ 
    // url with token 
    if($request->has('token')) { 
     $new_url = $request->url() . '/?' . http_build_query($request->except(['token'])); 

     $user = User::where('token', $request->input('token'))->first(); 

     Auth::login($user); 
     //dd(Auth::user()); // says the user is authenticated 
     return redirect($new_url)->send(); 
    } 
} 

Однако после перенаправления пользователь больше не аутентифицирован.

Что мне не хватает?

Кроме того, процесс создания токенов не имеет ничего общего с этой проблемой.

+0

'__constructs' не имеют возвращаемых значений. Они всегда возвращают 'void'. С учетом сказанного, поскольку вы используете токен для авторизации пользователя, я могу предположить, что вы также используете какой-то пакет, чтобы заботиться о генерации маркера. Если это так, нужна дополнительная информация. – Andrew

+1

Можете ли вы описать, по какой причине вам нужна аутентификация в конструкции? Возможно, есть еще одно решение: – Dmytrechko

+0

@Andrew проверить отредактированный вопрос. – Yurich

ответ

0

Я бы сказал, что лучшим решением является использование промежуточного программного обеспечения. Если по какой-то причине вы хотите, чтобы это было частью __construct, вы можете вызвать промежуточное программное обеспечение с контроллера, как указано на the documentation.

Таким образом, ваш контроллер будет что-то вроде:

public function __construct(Request $request) 
{ 
    $this->middleware('auth'); 
} 

И промежуточное Auth (класс Authenticate) будет иметь что-то вроде:

public function handle($request, Closure $next, $guard = null) 
{ 
    if($request->has('token')) { 
     $new_url = $request->url() . '/?' . http_build_query($request->except(['token'])); 
     $user = User::where('token', $request->input('token'))->first(); 

     if (is_object($user)) { 
      Auth::login($user); 

      return redirect()->to($new_url); 
     } 
    } 

    return $next($request); 
} 

Если вы не хотите возиться с auth вы всегда можете создать another middleware.