Multi-Auth Auth::user() Showing null Laravel 5.8



我正在实现多个身份验证,因为我有3个不同的用户组。我正在尝试以下步骤。

logincontroller.php

<?php
namespace AppHttpControllersAuth;
use AppHttpControllersController;
use IlluminateFoundationAuthAuthenticatesUsers;
use IlluminateHttpRequest;
use Auth;
class LoginController extends Controller
{
    use AuthenticatesUsers;

    protected $redirectTo = '/home';

    public function __construct()
    {
        $this->middleware('guest')->except('logout');
        $this->middleware('guest:admin')->except('logout');
        $this->middleware('guest:manager')->except('logout');
        $this->middleware('guest:vendor')->except('logout');
    }
    public function showAdminLoginForm()
    {
        return view('auth.login', ['url' => 'admin']);
    }
    public function adminLogin(Request $request)
    {
        $this->validate($request, [
            'email'   => 'required|email',
            'password' => 'required|min:6'
        ]);
        if (Auth::guard('admin')->attempt(['email' => $request->email, 'password' => $request->password], $request->get('remember'))) {
            return redirect()->intended('/admin');
        }
        return back()->withInput($request->only('email', 'remember'));
    }
    public function showManagerLoginForm()
    {
        return view('auth.login', ['url' => 'manager']);
    }
    public function managerLogin(Request $request)
    {
        $this->validate($request, [
            'email'   => 'required|email',
            'password' => 'required|min:6'
        ]);
        if (Auth::guard('manager')->attempt(['email' => $request->email, 'password' => $request->password], $request->get('remember'))) {
            return redirect()->intended('/manager');
        }
        return back()->withInput($request->only('email', 'remember'));
    }
    public function showVendorLoginForm()
    {
        return view('auth.login', ['url' => 'vendor']);
    }
    public function vendorLogin(Request $request)
    {
        $this->validate($request, [
            'email'   => 'required|email',
            'password' => 'required|min:6'
        ]);
        if (Auth::guard('vendor')->attempt(['email' => $request->email, 'password' => $request->password], $request->get('remember'))) {
            return redirect()->intended('/vendor');
        }
        return back()->withInput($request->only('email', 'remember'));
    }
}

admincontroller.php

<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use Auth;
class AdminController extends Controller
{
    public function __construct()
    {
        $this->middleware('guest:admin');   
    }
    public function dashboard()
    {
        dd(auth()->user());
        return view('admin');
    }
}

ManagerController vendorController adminController 相同。

web.php

Route::view('/', 'welcome');
Auth::routes();
Route::prefix('admin')->group(function () {
    Route::get('/login', 'AuthLoginController@showAdminLoginForm');
    Route::post('/login', 'AuthLoginController@adminLogin');
    Route::get('/register', 'AuthRegisterController@showAdminRegisterForm');
    Route::post('/register', 'AuthRegisterController@createAdmin');
});
Route::prefix('manager')->group(function () {
    Route::get('/login', 'AuthLoginController@showManagerLoginForm');
    Route::post('/login', 'AuthLoginController@managerLogin');
    Route::get('/register', 'AuthRegisterController@showManagerRegisterForm');
    Route::post('/register', 'AuthRegisterController@createManager');
});
Route::prefix('vendor')->group(function () {
    Route::get('/login', 'AuthLoginController@showVendorLoginForm');
    Route::post('/login', 'AuthLoginController@vendorLogin');
    Route::get('/register', 'AuthRegisterController@showVendorRegisterForm');
    Route::post('/register', 'AuthRegisterController@createVendor');
});

Route::view('/home', 'home')->middleware('auth');
Route::get('/admin', 'AdminController@dashboard');
Route::get('/manager', 'ManagerController@dashboard');
Route::get('/vendor', 'VendorController@dashboard');

redirectifauthenticated.php

<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateSupportFacadesAuth;
class RedirectIfAuthenticated
{
    public function handle($request, Closure $next, $guard = null)
    {
        if ($guard == "admin" && Auth::guard($guard)->check()) {
                return redirect('/admin');
        }
        if ($guard == "manager" && Auth::guard($guard)->check()) {
            return redirect('/manager');
        }
        if ($guard == "vendor" && Auth::guard($guard)->check()) {
            return redirect('/vendor');
        }
        if (Auth::guard($guard)->check()) {
            return redirect('/home');
        }
        return $next($request);
    }
}

config.auth.php

<?php
return [
    'defaults' => [
        'guard' => 'admin',
        'passwords' => 'admins',
    ],

    'guards' => [
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
        'manager' => [
            'driver' => 'session',
            'provider' => 'managers',
        ],
        'vendor' => [
            'driver' => 'session',
            'provider' => 'vendors',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
    ],
    'providers' => [
        'admins' => [
            'driver' => 'eloquent',
            'model' => AppAdmin::class,
        ],
        'managers' => [
            'driver' => 'eloquent',
            'model' => AppManager::class,
        ],

        'vendors' => [
            'driver' => 'eloquent',
            'model' => AppVendor::class,
        ],
    ],
    'passwords' => [
        'admins' => [
            'provider' => 'admins',
            'table' => 'password_resets',
            'expire' => 60,
        ],
        'managers' => [
            'provider' => 'managers',
            'table' => 'password_resets',
            'expire' => 60,
        ],
        'vendors' => [
            'provider' => 'vendors',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],
];

当我试图通过在admincontroller上执行dd((来获取auth :: user((时,它会因为多作用而显示为无效。尽管它成功登录了。我认为我没有为管理员使用适当的警卫。但是与此同时,我不知道如何解决此问题。请帮助我。

在多身份验证中:我们可以使用auth :: user((直接访问身份验证的用户。默认情况下,它将返回身份验证='用户'。对于其他身份验证,我们应该用户guard('Guard_Name'(。在您的情况下,您应该使用auth :: guard('admins'( -> user((而不是auth :: user((。

一切似乎都还好。但是您错过了为路由添加 Web中间件

请编辑您的 web.php 喜欢这样做。

 Route::group(['middleware' => ['web']], function () {
     // all your routes use Auth() besides login route should be encapsulated and go inside this.
 });

这是因为Web中间件有会话类,ncter app.http/kernel.php

IlluminateSessionMiddlewareStartSession::class,

最新更新