これは非常に基本的なフローのように思え、Laravel
には基本的なことに対するニースのソリューションが非常に多くあり、何かが足りないように感じます。
ユーザーが認証を必要とするリンクをクリックします。 Laravelのauthフィルターが起動し、ログインページにルーティングします。ユーザーはログインし、「auth」フィルターが有効になる前にアクセスしようとしていた元のページに移動します。
元々どのページにアクセスしようとしていたかを知る良い方法はありますか? Laravelはリクエストをインターセプトするものであるため、ユーザーがログインした後にルーティングを容易にするためにどこかを追跡するかどうかは知りませんでした。
そうでない場合、私はあなたの何人かがこれを手動で実装した方法を聞きたいです。
スコットの答え 以下を確認してください。
簡単に言えば、
認証ミドルウェアの場合:
// redirect the user to "/login"
// and stores the url being accessed on session
if (Auth::guest()) {
return redirect()->guest('login');
}
return $next($request);
ログインアクションの場合:
// redirect the user back to the intended page
// or defaultpage if there isn't one
if (Auth::attempt(['email' => $email, 'password' => $password])) {
return redirect()->intended('defaultpage');
}
この回答の時点では、フレームワーク自体からの公式のサポートはありませんでした。最近では使用できます 以下のbgdrlが指摘するメソッド このメソッド:(私は彼の答えを更新しようとしましたが、彼は受け入れないようです)
認証フィルター:
// redirect the user to "/login"
// and stores the url being accessed on session
Route::filter('auth', function() {
if (Auth::guest()) {
return Redirect::guest('login');
}
});
ログインアクションの場合:
// redirect the user back to the intended page
// or defaultpage if there isn't one
if (Auth::attempt(['email' => $email, 'password' => $password])) {
return Redirect::intended('defaultpage');
}
次のように実装できます。
Route::filter('auth', function() {
// If there's no user authenticated session
if (Auth::guest()) {
// Stores current url on session and redirect to login page
Session::put('redirect', URL::full());
return Redirect::to('/login');
}
if ($redirect = Session::get('redirect')) {
Session::forget('redirect');
return Redirect::to($redirect);
}
});
// on controller
public function get_login()
{
$this->layout->nest('content', 'auth.login');
}
public function post_login()
{
$credentials = [
'username' => Input::get('email'),
'password' => Input::get('password')
];
if (Auth::attempt($credentials)) {
return Redirect::to('logged_in_homepage_here');
}
return Redirect::to('login')->with_input();
}
セッションにリダイレクトを保存すると、ユーザーが資格情報の入力を間違えたり、アカウントを持っていないためにサインアップする必要がある場合でも、リダイレクトを保持できるという利点があります。
これにより、Auth以外にセッションでリダイレクトを設定することも可能になり、魔法のように動作します。
5.3での認証の変更により、この実装は少し簡単になり、認証ミドルウェアがサービスコンテナに移動されたため、5.2とは少し異なります。
/app/Http/Middleware/RedirectIfAuthenticated.php
ハンドル関数を少し変更して、次のようにします。
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect()->intended('/home');
}
return $next($request);
}
唯一の違いは4行目です。デフォルトでは次のようになります。
return redirect("/home");
Laravel> = 5.3は、Auth Guardのチェック時に最後の「意図した」ルートを自動的に保存するため、次のように変更されます。
return redirect()->intended('/home');
これはLaravelに、ログイン前に最後に意図したページにリダイレクトするよう指示します。そうでない場合は、「/ home」またはデフォルトでそれらを送信したい場所に移動します。
これが他の誰かの助けになることを願っています-5.2と5.3の違いについてはそれほど多くはありません。特にこの分野ではかなりの数があります。
私はあなたにとって非常に役立つかもしれないこれらの2つの素晴らしい方法を見つけました。
Redirect::guest();
Redirect::intended();
このフィルターは、認証が必要なルートに適用できます。
Route::filter('auth', function()
{
if (Auth::guest()) {
return Redirect::guest('login');
}
});
このメソッドが基本的に行うことは、アクセスしようとしたページを保存することであり、loginページにリダイレクトされます。
ユーザーが認証されたら、電話をかけることができます
return Redirect::intended();
そして、最初に到達しようとしていたページにリダイレクトされます。
私は通常以下の方法を使用しますが、それを行うには素晴らしい方法です。
Redirect::back()
this 素晴らしいブログを確認できます。
Redirect :: intended関数を使用できます。認証フィルターでキャッチされる前にアクセスしようとしたURLにユーザーをリダイレクトします。目的の宛先が利用できない場合に、このメソッドにフォールバックURIを与えることができます。
ログイン/登録後:
return Redirect::intended('defaultpageafterlogin');
私はこれをしばらくの間、言語選択コードで使用しています。 1ページだけ戻る必要がある限り、問題なく動作します。
return Redirect::to(URL::previous());
これは、最も強力なソリューションではありませんが、非常に簡単であり、いくつかのパズルの解決に役立ちます。 :)
return Redirect::intended('/');
これにより、プロジェクトのデフォルトページ、つまり開始ページにリダイレクトされます。
LoginControllersコンストラクターを次のように変更します。
public function __construct()
{
session(['url.intended' => url()->previous()]);
$this->redirectTo = session()->get('url.intended');
$this->middleware('guest')->except('logout');
}
ログインページの前のページに戻ります(2ページ前)。
laravel 5. *の場合は、これらを試してください。
return redirect()->intended('/');
または
return Redirect::intended('/');
(ViníciusFragoso Pinheiro)コードを少し調整し、filters.phpに以下を配置しました
Route::filter('auth', function()
{
// If there's no user authenticated session
if (Auth::guest()) {
// Flash current url to session and redirect to login page
Session::flash('redirect', URL::full());
return Redirect::guest('login');
}
});
そして、私のAuthController.php内で:
// Try to log the user in.
if (Auth::attempt($userdata)) {
if ($redirect = Session::get('redirect')) {
return Redirect::to($redirect);
} else {
// Redirect to homepage
return Redirect::to('your_default_logged_in_page')->with('success', 'You have logged in successfully');
}
} else {
// Reflash the session data in case we are in the middle of a redirect
Session::reflash('redirect');
// Redirect to the login page.
return Redirect::to('login')->withErrors(['password' => 'Password invalid'])->withInput(Input::except('password'));
}
認証の問題がある場合、'redirect'
セッションデータが再フラッシュされることに注意してください。これにより、ログインの失敗時にリダイレクトがそのまま保持されますが、ユーザーが任意の時点でクリックする場合、次のログインプロセスはセッションデータによって中断されません。
また、AuthController
にログインフォームを表示する時点でデータを再フラッシュする必要があります。そうしないと、チェーンが破損します。
public function showLogin()
{
// Reflash the session data in case we are in the middle of a redirect
Session::reflash('redirect');
// Show the login page
return View::make('auth/login');
}
Redirect;
を使用
次にこれを使用します:
return Redirect::back();
Laravel 5.5およびおそらく5.4
App\Http\Middleware\RedirectIfAuthenticatedで、ハンドル関数のredirect('/home')
をredirect()->intended('/home')
に変更します。
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect()->intended('/home');
}
return $next($request);
}
App\Http\Controllers\Auth\LoginController以下のようにshowLoginForm()
関数を作成します。
public function showLoginForm()
{
if(!session()->has('url.intended'))
{
session(['url.intended' => url()->previous()]);
}
return view('auth.login');
}
この方法は、別のページにインテントがあった場合、そこにリダイレクトし、そうでなければホームにリダイレクトします。
Laravle 5.7の場合、次の変更を行う必要があります。
ミドルウェア> RedirectIfAuthenticated.php
これを変更:
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect('/admin');
}
return $next($request);
}
これに:
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect('/yourpath');
}
return $next($request);
}
return redirect( '/ yourpath');
Laravelはすぐにこの機能をサポートするようになりました!(5.5以前から信じています)。
以下に示すように、Controller
に__construct()
メソッドを追加します。
public function __construct()
{
$this->middleware('auth');
}
ログイン後、ユーザーは最初にアクセスする予定のページにリダイレクトされます。
アプリケーションロジックの必要に応じて、Laravelのメール検証機能を追加することもできます。
public function __construct()
{
$this->middleware('auth');
$this->middleware('verified');
}
ドキュメントには、非常に簡単な例が含まれています。
ボーナス:except
またはonly
オプションを使用して、ミドルウェアが適用されるコントローラーのメソッドを選択することもできます。
except
の例:
public function __construct()
{
$this->middleware('auth', ['except' => ['index', 'show']]);
}
only
の例:
public function __construct()
{
$this->middleware('auth', ['only' => ['index', 'show']]);
}
except
およびonly
ミドルウェアオプションの詳細:
Laravel 5.7のカスタムログインコントローラーとミドルウェアで次のアプローチを使用していますが、laravel 5バージョンのいずれでも動作することを望みます
ミドルウェアの中
if (Auth::check()){
return $next($request);
}
else{
return redirect()->guest(route('login'));
}
内部コントローラログインメソッド
if (Auth::attempt(['email' => $email, 'password' => $password])) {
return redirect()->intended('/default');
}
意図したURLをクライアント側に渡す必要がある場合は、次を試してください。
if (Auth::attempt(['username' => $request->username, 'password' => $request->password])) {
$intended_url= redirect()->intended('/default')->getTargetUrl();
$response = array(
'status' => 'success',
'redirectUrl' => $intended_url,
'message' => 'Login successful.you will be redirected to home..', );
return response()->json($response);
} else {
$response = array(
'status' => 'failed',
'message' => 'username or password is incorrect', );
return response()->json($response);
}