【问题标题】:Auth::user() return null in Laravel 5.8Auth::user() 在 Laravel 5.8 中返回 null
【发布时间】:2019-09-20 13:57:10
【问题描述】:

我在我的 Laravel 5.8.10 项目中遇到了身份验证问题。我没有使用 Laravel 为身份验证创建的默认表单。当我在浏览器中访问 URL/仪表板时,通常用户会在登录时获得重定向重定向。无论如何,该应用程序都允许它。此外,当我使用 Auth::user() 时,它返回 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

这个想法是,当注册用户时它为假时,它会停止加密密码,当它为真时,进行加密。这是有效的。

数据库用户

https://pasteboard.co/IcMC2ds.png

【问题讨论】:

    标签: php laravel-5.8


    【解决方案1】:
    1. 在没有身份验证的情况下停止重定向到仪表板使用身份验证中间件路由

      Route::middleware(['auth'])->group(function () {    
          Route::get('/dashboard', ['as' => 'user.dashboard', 'uses' => 'DashboardController@index']);    
      });
      
    2. env 返回字符串,不是布尔值,所以使用env('PASSWORD_HASH') == 'true' 检查密码哈希是否启用

    3. 使用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
        }
      }
      

    【讨论】:

    • 老兄,成功了!起初,问题似乎只是缺少这个中间件。我也对 PASSWORD_HASH 检查进行了更正,谢谢!!
    • 现在当我执行 dd (Auth :: user ()) 时,它会返回包含经过身份验证的用户的数组,谢谢:D
    • 嘿朋友,实际上我注意到他正在使用我输入的任何电子邮件和密码进行身份验证,你知道它是什么吗?无论登录的用户如何,它都会显示第一次登录的用户
    • 您是根据邮箱和密码对用户进行身份验证,因此不需要在控制器中检查密码哈希条件,因为它已经由模型管理。检查我刚刚编辑的答案。
    • dd(Auth::attempt($credentials));返回 false :/
    猜你喜欢
    • 2020-01-22
    • 1970-01-01
    • 2016-05-13
    • 2020-08-14
    • 1970-01-01
    • 2023-02-04
    • 2017-03-17
    • 2021-01-02
    • 2017-06-29
    相关资源
    最近更新 更多