web-dev-qa-db-ja.com

Laravel 5ユーザーがログインした後にセッションが持続しない

Laravel 5。

ユーザーのログイン後、ログイン状態はページ間で保持されません。明らかに、_Session::_と関係があります。

ユーザーのログイン方法は非常に簡単です。

_if (Auth::attempt(['email' => $data['email'], 'password' => $data['password']],
    isset($data['remember_me']) ? TRUE : FALSE))
{
    return redirect()->intended('/');
}
_

ユーザーがログインしていない場合は、単純なprint_r(Session::all());によって次のメッセージが表示されます。

_Array
(
    [_token] => wV8o75lZnCZ0f6CMMQgdBBM2AxSYjtWisAXx6TgZ
    [flash] => Array
        (
            [old] => Array
                (
                )

            [new] => Array
                (
                )

        )

    [_previous] => Array
        (
            [url] => http://localhost/public
        )

)
_

ユーザーが_/_にリダイレクトされてログインした後、配列は次のようになります。

_Array
(
    [_token] => wV8o75lZnCZ0f6CMMQgdBBM2AxSYjtWisAXx6TgZ
    [flash] => Array
        (
            [old] => Array
                (
                )

            [new] => Array
                (
                )

        )

    [_previous] => Array
        (
            [url] => http://localhost/public/
        )

    [login_82e5d2c56bdd0811318f0cf078b78bfc] => 2
)
_

ただし、ページの更新またはリダイレクトにつながるアクションの後、セッションステータスは失われます。

_config/session.php_ファイルは次のようになります。

_<?php

return [
    'driver' => env('SESSION_DRIVER', 'file'),
    'lifetime' => 120,
    'expire_on_close' => false,
    'encrypt' => false,
    'files' => storage_path('framework/sessions'),
    'connection' => null,
    'table' => 'sessions',
    'lottery' => [2, 100],
    'cookie' => 'laravel_session',
    'path' => '/',
    'domain' => null,
    'secure' => false,

];
_

セッション用にローカルに保存されたファイルは、書き込みおよび読み取りが可能です。

ファイルの代わりにdatabaseドライブを使用してみました。同じことが_[login_xx] => 2_キー/値が失われ、ログアウトしました。

_Session::_は完全にリセットされていないため、ユーザーに適切にログインしていないか、どこかで行うべきではないことをしているだけではないかと疑っています。

61
Andrei

私は同様の問題に直面しました、私は単に電話しました:

Session::save();

セッションストレージへの追加/更新/削除の後。そのため、次のようになりました。

$id = Input::get('id');
Session::forget('cart.' .$id);
Session::save();
12
Kalpesh Panchal

同じ問題がありました。 dd()とprint_r()のさまざまな組み合わせを削除して、テスト目的で応答をダンプし、メソッドがビューを完了して完全にレンダリングできるようにすると、問題はなくなり、セッションが持続しました。

10
spedley

変化を解決した

'cookie' => 'laravel_session',

'cookie' => 'myapp_session',

laravelに従って、Cookieの名前はすべてのドライバーに影響します

5

私はLaravelに精通していませんが、CodeIgniterではCIのセッションクラスにユーザーセッションを保存し、Laravelも持っています。

build-in session を使用することをお勧めします。これはデフォルトの$ _SESSIONよりも永続的です。おそらく、データベースにユーザーデータを保存し、ページの更新/変更ごとにセッションがDBから再び読み込まれます。

ユーザーが認証されたら、次のようにセッションデータを保存するだけです。

Session::put('userData', 'value');

...ここで、値は単なるブール値でも、ユーザー固有のデータを保持するオブジェクト全体でもかまいません。

各ページの読み込みで、セッションからユーザーデータを取得します。

$user = Session::get('userData');

if($user->id) echo 'user is logged-in'; //or if($user) - depends on what you store in 'userData' key
else echo 'guest only privilegies';

EDIT:Authクラスを使用していることがわかります。私の答えは主にユーザーの手動ログインであり、それは動作します。
Authクラスはデフォルトでこれを行うべきだと思いますが、おそらくいくつかの設定が欠落しているか、バグがあります。

考えられる解決策は次のとおりです(Laravel 4、試してみる価値あり): http://laravel.io/forum/11-11-2014-authcheck-always-returning-false

更新:

this の時点で、ドライバーの値を変更しようとする必要があります

'driver' => env('SESSION_DRIVER', 'file')

'driver' => 'file'

... Laravelのドキュメントでも、ドライバーをそのように定義する必要があることがわかります。

1
tbutcaru

デフォルトのlaravelのfile sessionを使用している場合は、session.phpファイルで使用しているかどうかを確認できる2つのことを確認する必要があります。

  1. セッションディレクトリ、つまりstorage/framework/session /は書き込み可能です。
  2. 多分ログイン(/ login)および認証チェック(多分/ dashboard)のルートはすべてグループweb内にあります

すなわち。

Route::group(['middleware' => ['web']], function () {
   Route::get('/home/login', ['as' => 'login', 'uses' => 'HomeController@getLogin']);
Route::post('/home/login', ['as' => 'login', 'uses' => 'HomeController@postLogin']);
   Route::get('/home/dashboard', ['as' => 'home', 'uses' => 'HomeController@getDashboard']);
}

これはLaravel 5。

1

まず、ログアウトの原因となる何らかの前のフィルター、ミドルウェア、またはルートグループがないことを確認します。少なくとも一時的に、Auth :: logout()を検索してコメント化します。私はこれが何度も問題であることを見てきました。

次に、この呼び出しを正しく実行しているように見えます。 3番目のパラメーターは$ login:boolで、デフォルトはtrueです。これはあなたの問題ではありませんが、PSR-1/2標準を満たすためにTRUEとFALSEをtrueとfalseに変更してください。

別のドライバーを試すことをお勧めしますが、それを行って同じ結果が得られます。これにより、logout()に誤った方向を向ける何らかの初期のコードがあると考えるようになります。

1
Rob_vH

私の場合、app/config/sessions.phpファイルのドメイン設定を変更する必要がありました。私が使用していたドメインではなく、別のドメインがそこに記述されていたため、当然動作しませんでした。フレームワークが先に進み、ページをリロードするたびにセッションファイルを作成した理由はわかりませんが。

0
user2962785

correctHum ...マシンが適切な日付と時間で設定されていること、およびネットワーク上の他のマシンも同様に設定されていることを確認してください。

Debianシステムの例:

コマンドプロンプトで、dateを押します()日付が表示されます。正しくない場合は、次の指示に従ってください。

  1. apt-get install ntp
  2. サービスntp開始
  3. 日付(通常、日付と時刻は修正されます)
0
ShuifuraX

同様の問題がありましたが、セッションドライバーをSESSION_DRIVER=databaseからSESSION_DRIVER=file

0
Juancho Ramone

loginUsingId()メソッドを使用している場合、 'remember'フラグをtrueに設定する必要があります。

だから、代わりに:

loginUsingId(1);

やったほうがいい

loginUsingId(1, true);

ドキュメントを参照

0
Abhishek

Session.phpの「ファイル」の代わりに「cookie」ドライバーを使用します(config\session.php\driver)。 「Auth :: attempt()」apiの代わりに「Auth :: loginUsingId()」apiを使用したログインで問題が発生しました。別のリクエストのセッションが破壊されました。

0
namal

laravel 5.4で同じ問題が発生しました。私にとっての解決策は次のとおりです。

ファイル/app/Http/Kernel.phpで、デフォルトでミドルウェアAuthenticateSessionがコメントされました。

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        //\Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

この行のコメントを外してのみ、セッションはすべてのルートで正常に動作します

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];
0
rolodef

ターゲットルートもミドルウェアStartSessionを使用していることを確認してください。 Laravel 5.2の「フレッシュ」インストールでは、「web」ミドルウェアグループがそれを使用しますが、ログイン後にデフォルトの$ redirectToであるルートパス(/)は、時間の大幅な損失。

0
iipavlov

私は同じ問題を抱えていましたが、現在修正されています。

これは、マシンのセッションとlocalhostドメインのセッションが競合しているためです。問題を解決するため:

まず、config/session.phpファイルして、これを確認します。

'domain' => null,

その後、Cookieをクリアします。

firefoxでは、右クリック->ページ情報を表示->セキュリティ-> Cookieを表示->すべて削除

0
Kamran

私はこの問題を抱えており、この方法で解決します。 _Auth::attemp_またはAuth::login()を使用した後、echo, var_dump or dd()を使用しない.

そして今、働いています

_                public function testLogin(Request $request, $id){

                    $user = Account::find($id);
                    Auth::login($user);

                }
_
0
roll