Auth::user() return Laravel 5.8 中为空
Auth::user() return null in Laravel 5.8
我在 Laravel 5.8.10 项目中遇到身份验证问题。我没有使用 Laravel 创建的默认表单进行身份验证。当我在浏览器中访问 URL/dashboard 时,通常用户会在登录时被重定向。该应用程序无论如何都允许它。另外,当我使用 Auth::user()
时,它 returns null.
当我键入无效的用户名和密码时,它不会从登录屏幕传递。当我键入无效凭据时,它会重定向到仪表板。通过仪表板视图访问 URL 的问题也仍然存在。就好像不需要认证访问路由一样。
注意:我的 .env 文件中有一个变量 PASSWORD_HASH
用于启用或禁用密码加密。
用户模型
namespace App\Entities;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Authenticatable
{
use Notifiable;
use SoftDeletes;
protected $table = "users";
public $timestamps = true;
protected $fillable = [
'cpf', 'name', 'phone', 'birth', 'gender', 'notes', 'email', 'password', 'status', 'permission'
];
protected $hidden = [
'password', 'remember_token',
];
public function groups()
{
return $this->belongsToMany(Group::Class, 'user_groups');
}
public function setPasswordAttribute($value)
{
$this->attributes['password'] = env('PASSWORD_HASH') ? bcrypt($value) : $value;
}
}
config/auth.php
return [
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Entities\User::class,
],
],
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
],
],
];
仪表板控制器
public function auth(Request $request)
{
$data = [
'email' => $request->get('username'),
'password' => $request->get('password')
];
try {
if (env('PASSWORD_HASH')) {
Auth::attempt($data, false);
} else {
$user = $this->repository->findWhere(['email' => $request->get('username')])->first();
if (!$user)
throw new Exception("O e-mail informado é inválido. PEEEEN!");
if ($user->password != $request->get('password'))
throw new Exception("A senha informada é inválida. PEEEEN!");
Auth::login($user);
}
return redirect()->route('user.dashboard');
} catch (Exception $e) {
return $e->getMessage();
}
}
路线
Route::get('/login', ['uses' => 'Controller@fazerlogin']);
Route::post('/login', ['as' => 'user.login', 'uses' => 'DashboardController@auth']);
Route::get('/dashboard', ['as' => 'user.dashboard', 'uses' => 'DashboardController@index']);
查看登录
<section id="conteudo-view" class="login">
<h1>Investindo</h1>
<h3>O nosso gerenciador de investimento</h3>
{!! Form::open(['route' => 'user.login', 'method' => 'post']) !!}
<p>Acesse o sistema</p>
<label>
{!! Form::text('username', null, ['class' => 'input', 'placeholder' => "Usuário"]) !!}
</label>
<label>
{!! Form::password('password', ['placeholder' => 'Senha']) !!}
</label>
{!! Form::submit('Entrar') !!}
{!! Form::close() !!}
</section>
.env
PASSWORD_HASH=false
想法是,当注册用户时为假时,它停止加密密码,为真时,进行加密。这是有效的。
数据库用户
在未经授权的情况下停止重定向到仪表板使用授权中间件路由
Route::middleware(['auth'])->group(function () {
Route::get('/dashboard', ['as' => 'user.dashboard', 'uses' => 'DashboardController@index']);
});
env return 字符串,不是布尔值所以使用 env('PASSWORD_HASH') == 'true'
检查密码哈希是否启用
使用loginUsingId()
手动登录。
if(env('PASSWORD_HASH') == 'true') {
Auth::attempt($data, false);
} else {
$user = User::where('email', $request->username)->where('password', $request->password)->first();
if(!$user){
throw new Exception("O e-mail informado é inválido. PEEEEN!");
} else {
Auth::loginUsingId($user->id);
//redirect
}
}
我在 Laravel 5.8.10 项目中遇到身份验证问题。我没有使用 Laravel 创建的默认表单进行身份验证。当我在浏览器中访问 URL/dashboard 时,通常用户会在登录时被重定向。该应用程序无论如何都允许它。另外,当我使用 Auth::user()
时,它 returns null.
当我键入无效的用户名和密码时,它不会从登录屏幕传递。当我键入无效凭据时,它会重定向到仪表板。通过仪表板视图访问 URL 的问题也仍然存在。就好像不需要认证访问路由一样。
注意:我的 .env 文件中有一个变量 PASSWORD_HASH
用于启用或禁用密码加密。
用户模型
namespace App\Entities;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Authenticatable
{
use Notifiable;
use SoftDeletes;
protected $table = "users";
public $timestamps = true;
protected $fillable = [
'cpf', 'name', 'phone', 'birth', 'gender', 'notes', 'email', 'password', 'status', 'permission'
];
protected $hidden = [
'password', 'remember_token',
];
public function groups()
{
return $this->belongsToMany(Group::Class, 'user_groups');
}
public function setPasswordAttribute($value)
{
$this->attributes['password'] = env('PASSWORD_HASH') ? bcrypt($value) : $value;
}
}
config/auth.php
return [
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Entities\User::class,
],
],
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
],
],
];
仪表板控制器
public function auth(Request $request)
{
$data = [
'email' => $request->get('username'),
'password' => $request->get('password')
];
try {
if (env('PASSWORD_HASH')) {
Auth::attempt($data, false);
} else {
$user = $this->repository->findWhere(['email' => $request->get('username')])->first();
if (!$user)
throw new Exception("O e-mail informado é inválido. PEEEEN!");
if ($user->password != $request->get('password'))
throw new Exception("A senha informada é inválida. PEEEEN!");
Auth::login($user);
}
return redirect()->route('user.dashboard');
} catch (Exception $e) {
return $e->getMessage();
}
}
路线
Route::get('/login', ['uses' => 'Controller@fazerlogin']);
Route::post('/login', ['as' => 'user.login', 'uses' => 'DashboardController@auth']);
Route::get('/dashboard', ['as' => 'user.dashboard', 'uses' => 'DashboardController@index']);
查看登录
<section id="conteudo-view" class="login">
<h1>Investindo</h1>
<h3>O nosso gerenciador de investimento</h3>
{!! Form::open(['route' => 'user.login', 'method' => 'post']) !!}
<p>Acesse o sistema</p>
<label>
{!! Form::text('username', null, ['class' => 'input', 'placeholder' => "Usuário"]) !!}
</label>
<label>
{!! Form::password('password', ['placeholder' => 'Senha']) !!}
</label>
{!! Form::submit('Entrar') !!}
{!! Form::close() !!}
</section>
.env
PASSWORD_HASH=false
想法是,当注册用户时为假时,它停止加密密码,为真时,进行加密。这是有效的。
数据库用户
在未经授权的情况下停止重定向到仪表板使用授权中间件路由
Route::middleware(['auth'])->group(function () { Route::get('/dashboard', ['as' => 'user.dashboard', 'uses' => 'DashboardController@index']); });
env return 字符串,不是布尔值所以使用
env('PASSWORD_HASH') == 'true'
检查密码哈希是否启用使用
loginUsingId()
手动登录。if(env('PASSWORD_HASH') == 'true') { Auth::attempt($data, false); } else { $user = User::where('email', $request->username)->where('password', $request->password)->first(); if(!$user){ throw new Exception("O e-mail informado é inválido. PEEEEN!"); } else { Auth::loginUsingId($user->id); //redirect } }