同様の問題を抱えた多くのリソースをオンラインで見つけましたが、どの問題も私の問題を解決するようには見えません。
次のコードでユーザーをログインすると、すべてがうまくいくようです:
_$email = Input::get('email');
$password = Input::get('password');
if (Auth::attempt(array('email' => $email, 'password' => $password))) {
return Auth::user();
} else {
return Response::make("Invalid login credentials, please try again.", 401);
}
_
Auth::attempt()
関数はtrue
を返し、ログインしたユーザーはAuth::user()
を使用してクライアントに返されます。
ただし、クライアントがサーバーの直後に別の要求を行うと、Auth::user()
はNULL
を返します。
Session::put()
とSession::get()
を使用して、Laravelセッションが正常に機能していることを確認しました。
さらに調査すると、セッションも持続していないようです!これは、app.mydomain.com経由でAngularJS Webアプリサーバーを使用し、api.mydomain.com経由で提供されるLaravel API?
私のユーザーモデルは次のとおりです。
_<?php
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;
class User extends Eloquent implements UserInterface, RemindableInterface {
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'users';
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = array('password');
/**
* Get the unique identifier for the user.
*
* @return mixed
*/
public function getAuthIdentifier()
{
return $this->getKey();
}
/**
* Get the password for the user.
*
* @return string
*/
public function getAuthPassword()
{
return $this->password;
}
/**
* Get the e-mail address where password reminders are sent.
*
* @return string
*/
public function getReminderEmail()
{
return $this->email;
}
}
_
私の認証設定は次のとおりです。
_<?php
return array(
/*
|--------------------------------------------------------------------------
| Default Authentication Driver
|--------------------------------------------------------------------------
|
| This option controls the authentication driver that will be utilized.
| This driver manages the retrieval and authentication of the users
| attempting to get access to protected areas of your application.
|
| Supported: "database", "eloquent"
|
*/
'driver' => 'eloquent',
/*
|--------------------------------------------------------------------------
| Authentication Model
|--------------------------------------------------------------------------
|
| When using the "Eloquent" authentication driver, we need to know which
| Eloquent model should be used to retrieve your users. Of course, it
| is often just the "User" model but you may use whatever you like.
|
*/
'model' => 'User',
/*
|--------------------------------------------------------------------------
| Authentication Table
|--------------------------------------------------------------------------
|
| When using the "Database" authentication driver, we need to know which
| table should be used to retrieve your users. We have chosen a basic
| default value but you may easily change it to any table you like.
|
*/
'table' => 'users',
/*
|--------------------------------------------------------------------------
| Password Reminder Settings
|--------------------------------------------------------------------------
|
| Here you may set the settings for password reminders, including a view
| that should be used as your password reminder e-mail. You will also
| be able to set the name of the table that holds the reset tokens.
|
| The "expire" time is the number of minutes that the reminder should be
| considered valid. This security feature keeps tokens short-lived so
| they have less time to be guessed. You may change this as needed.
|
*/
'reminder' => array(
'email' => 'emails.auth.reminder',
'table' => 'password_reminders',
'expire' => 60,
),
);
_
users
テーブルの作成に使用される移行は次のとおりです。
_<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function(Blueprint $table)
{
$table->increments('id');
$table->string('email')->unique();
$table->string('password');
$table->string('first_name');
$table->string('last_name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function(Blueprint $table)
{
//
});
}
}
_
そして、セッション構成:
_<?php
return array(
/*
|--------------------------------------------------------------------------
| Default Session Driver
|--------------------------------------------------------------------------
|
| This option controls the default session "driver" that will be used on
| requests. By default, we will use the lightweight native driver but
| you may specify any of the other wonderful drivers provided here.
|
| Supported: "file", "cookie", "database", "apc",
| "memcached", "redis", "array"
|
*/
'driver' => 'database',
/*
|--------------------------------------------------------------------------
| Session Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes that you wish the session
| to be allowed to remain idle before it expires. If you want them
| to immediately expire on the browser closing, set that option.
|
*/
'lifetime' => 120,
'expire_on_close' => false,
/*
|--------------------------------------------------------------------------
| Session File Location
|--------------------------------------------------------------------------
|
| When using the native session driver, we need a location where session
| files may be stored. A default has been set for you but a different
| location may be specified. This is only needed for file sessions.
|
*/
'files' => storage_path().'/sessions',
/*
|--------------------------------------------------------------------------
| Session Database Connection
|--------------------------------------------------------------------------
|
| When using the "database" or "redis" session drivers, you may specify a
| connection that should be used to manage these sessions. This should
| correspond to a connection in your database configuration options.
|
*/
'connection' => null,
/*
|--------------------------------------------------------------------------
| Session Database Table
|--------------------------------------------------------------------------
|
| When using the "database" session driver, you may specify the table we
| should use to manage the sessions. Of course, a sensible default is
| provided for you; however, you are free to change this as needed.
|
*/
'table' => 'sessions',
/*
|--------------------------------------------------------------------------
| Session Sweeping Lottery
|--------------------------------------------------------------------------
|
| Some session drivers must manually sweep their storage location to get
| rid of old sessions from storage. Here are the chances that it will
| happen on a given request. By default, the odds are 2 out of 100.
|
*/
'lottery' => array(2, 100),
/*
|--------------------------------------------------------------------------
| Session Cookie Name
|--------------------------------------------------------------------------
|
| Here you may change the name of the cookie used to identify a session
| instance by ID. The name specified here will get used every time a
| new session cookie is created by the framework for every driver.
|
*/
'cookie' => 'laravel_session',
/*
|--------------------------------------------------------------------------
| Session Cookie Path
|--------------------------------------------------------------------------
|
| The session cookie path determines the path for which the cookie will
| be regarded as available. Typically, this will be the root path of
| your application but you are free to change this when necessary.
|
*/
'path' => '/',
/*
|--------------------------------------------------------------------------
| Session Cookie Domain
|--------------------------------------------------------------------------
|
| Here you may change the domain of the cookie used to identify a session
| in your application. This will determine which domains the cookie is
| available to in your application. A sensible default has been set.
|
*/
'domain' => null,
/*
|--------------------------------------------------------------------------
| HTTPS Only Cookies
|--------------------------------------------------------------------------
|
| By setting this option to true, session cookies will only be sent back
| to the server if the browser has a HTTPS connection. This will keep
| the cookie from being sent to you if it can not be done securely.
|
*/
'secure' => false,
);
_
何か案は?
この問題がありました。ユーザーモデルの主キーを変更すると、助けになりました。
のようなものを追加してみてください
protected $primaryKey = 'user_id';
クラスUser {}(app/models/User.php)
(フィールドuser_id
は、「ユーザー」テーブルのスキーマの自動インクリメントキーです)
このチケットも参照してください: https://github.com/laravel/framework/issues/161
今日の朝、この問題が発生しました。電話をかける前にデータを出力すると、
Auth::attempt($credentials);
その後、セッションが設定されないことを確認できます。たとえば、次のような場合
echo "This is the user " . $user;
言う行のすぐ上
Auth::attempt($credentials);
その後、午前中はなぜlaravel=が認証されたユーザーを保持せず、
Auth::user()
あなたにnullを与え、また呼び出します
Auth::check()
常に偽りを与えます。
これが私の問題であり、それがechoステートメントを削除することで修正した方法です。
laravel 5.7。認証後にセッションが持続しない場合に同様の問題に直面した人は誰でも、以下のような解決策に従うことができます。
ファイルを開くApp\Http\kernel.php
移動\Illuminate\Session\Middleware\StartSession::class,
from protected $middlewareGroups
からprotected $middleware
。それでおしまい。
true
パラメータのremember
をAuth:attempt()に渡してみてください:
if ( Auth::attempt(array('email' => $email, 'password' => $password), true) ) {
return Auth::user();
} else {
return Response::make("Invalid login credentials, please try again.", 401);
}
しかし、なぜAuth :: user()を返すのかまったくわかりません。
私は同様の問題を抱えていましたが、最終的にはバックエンドに集中しすぎたため、フロントエンドに問題があるとは考えませんでした。
ブレードを使用してAuth:logout()
をフロントエンドに直接出力し、次のようにログアウトボタンを作成しました。
_<a href="{{Auth::logout()}}">Log out</a>
_
それは間違っています。アプリケーションにログインするたびに、このボタンがオンになっているページにリダイレクトされ、押されたときにAuth::logout()
を呼び出すと誤って考えていました。もちろん、PHPはページロードでレンダリングされ、Auth::logout()
がすぐに呼び出されます。その後、ユーザーがログアウトしているため、別のページに移動するとログインページにリダイレクトされ、プロセスが再び開始されます。
参考-デフォルトの認証ルートコントローラを使用している場合、ログアウトボタンを作成する正しい方法は、次のようにルート「/ auth/logout」にリダイレクトすることです。
<a href="{{url('/auth/logout')}}">Log Out</a>
まず、Laravel 5.8。
少なくとも私の場合、@ nayeem-azadの解決策が良い解決策であることを確認します。 App\Http\kernel.phpの1つの違いは、この行を移動しません:
\Illuminate\Session\Middleware\StartSession::class
from protected $ middlewareGroups to protected $ middlewareしかし、それをprotected $ middlewareにのみコピーしました。
それが役に立てば幸い ;-)
使用してみてください
ob_start();
ob_flush();
returnまたはechoステートメントの前。
ez:
public function login() {
PogfixHelper::$return['ret'] = "error";
$iten = array(
'email' => Input::get("Mail"),
'password' => Input::get("Password"),
'flag_ativo' => 1
);
if (Auth::attempt($iten)) {
PogfixHelper::$return['ret'] = "ok";
PogfixHelper::$return['okMsg'] = "U are in";
PogfixHelper::$return['redirect'] = URL::to('panel/calendar');
} else {
PogfixHelper::$return['errorMsg'] = "Password not match";
}
ob_start();
ob_flush();
echo json_encode(PogfixHelper::$return);
}
Laravel 5.7を使用します。
同じ問題がありましたが、ログインにユーザー名を使用しようとしていたためです。デフォルトのemail
、name
、およびpassword
そしてemail
を介してログインしたくない場合は、vendor/laravel/framework/src/Illuminate/Foundation/Auth/
に移動してAuthenticatesUsers.php
ファイルを開きます。その中にusername
というパブリック関数があります:
/**
* Get the login username to be used by the controller.
*
* @return string
*/
public function username()
{
return 'email'; // <----
}
ご覧のとおり、デフォルトでは'email'
に設定されています。次に、これをユーザーがパスワードと組み合わせてログインするときに使用するものに変更できます。そのため、私のWebサイトでは、ユーザーがusername
を使用してログインすることを望んでいました。したがって、単に'email'
から'username'
に変更します。
これが誰かの助けになることを願っています。
注:奇妙なことに、何らかの理由で、username
およびpassword
を使用してログインしようとしてもエラーは発生しませんでした。代わりに、それは一見検証されますが、ユーザーを永続化しないだけで、理由はわかりません。
セッションテーブルのidフィールドはどのくらいですか? LaravelはセッションIDとしてsha1ハッシュを使用します。これにより、長さ40の文字列が生成されます。同様の問題が発生しました。idフィールドの長さが32に設定されたためです。
この質問を参照してください: Laravel 4.1認証セッションデータがリクエスト間で保持されない
深く掘り下げたわけではありませんが、laravelは安全な接続を介してのみCookieを返します。
お気づきのように、laravelはcookieを設定していますが、セッションのlifetime設定に応答していません.php
/*
|--------------------------------------------------------------------------
| Session Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes that you wish the session
| to be allowed to remain idle before it expires. If you want them
| to immediately expire when the browser closes, set it to zero.
|
*/
'lifetime' => 60*24*30, //doesn't seem to work ?
これをローカルサーバーで機能させるには、https接続を模倣して、ログインが持続することを確認する必要があります。これを行うには、ローカルドメインの偽のSSL証明書/キーを生成します。
SSLを有効にするのに役立ついくつかのチュートリアルがオンラインで利用できます。
これらは役に立つかもしれません:
問題はセッション構成にある可能性があります。セッションテーブルを設定したかどうかを確認しますLaravelは「データベース」ドライバーを使用する必要があります。
ここで設定を確認できます: http://laravel.com/docs/session#database-sessions
お役に立てれば!