2016-09-29 8 views
0

任意のURLのトークンによる認証を実行します。この認証は、ルートとトークンがusersテーブル(フィールドtoken)に格納される前に呼び出されます。コンストラクタでユーザーを認証します

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に記載されているように、コントローラからミドルウェアを呼び出すことができます。あなたはauthを台無しにしたくない場合は

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

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

とのようなものを持っているでしょう認証ミドルウェア(クラスAuthenticate):

だから、あなたのコントローラは次のようになりますanother middlewareをいつでも作成できます。

関連する問題