Laravel自定义包中自定义Auth Guard登录后Auth值为Null问题
Laravel自定义包多守卫认证跳转后Auth返回Null问题
问题场景
开发Laravel自定义包时,创建了继承Illuminate\Foundation\Auth\User的Store模型,配置了retail_shop认证守卫及对应Eloquent提供者。登录方法中可正常获取Auth信息,但重定向到应用auth:retail_shop中间件的dashboard路由后,Auth返回Null。
相关代码
1. Store模型
namespace Stegback\RetailShop\Models; use Illuminate\Foundation\Auth\User; class Store extends User { protected $guard = 'retail_shop'; protected $fillable = [ 'name', 'email', 'password', 'role', 'storeName', 'active', 'address', 'pincode' ]; protected $hidden = [ 'password', 'remember_token', ]; protected $casts = [ 'password' => 'hashed', ]; }
2. 登录方法
public function login(Request $request) { $validator = Validator::make($request->all(), [ 'email' => 'required|email', 'password' => 'required', ]); if ($validator->fails()) { return redirect()->back()->withErrors($validator); } if (Auth::guard('retail_shop')->attempt(['email' => $request->email, 'password' => $request->password])) { $storeName = auth('retail_shop')->user()->storeName; $userId = base64_encode(auth('retail_shop')->user()->id); return redirect()->route('ReatilShop.store-dashboard', ['store' => $storeName, 'i' => $userId]); } else { return redirect()->back()->withInput()->withErrors(['errors' => 'Invalid email or password']); } }
3. config/auth.php配置
'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'retail_shop' => [ 'driver' => 'eloquent', 'model' => Stegback\RetailShop\Models\Store::class, ], ], 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'retail_shop' => [ 'driver' => 'session', 'provider' => 'retail_shop', ], ],
4. 服务提供者
namespace Stegback\RetailShop; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\File; use Illuminate\Support\ServiceProvider; class RetailShopServiceProvider extends ServiceProvider { public function boot() { if (File::exists(__DIR__ . '\\Helpers\\CommonHelper.php')) { require __DIR__ . '\\Helpers\\CommonHelper.php'; } $this->loadRoutesFrom(__DIR__ . '/routes/retail-shop-routes.php'); $this->loadMigrationsFrom(__DIR__ . '/database/migrations'); $this->loadViewsFrom(resource_path('views'), 'laravel'); $this->loadViewsFrom(__DIR__ . '/views/RetailShop', 'RetailShop'); $this->publishes([ __DIR__ . '/views' => resource_path('/views'), ], 'stegback-retail-shop-views'); // $this->app['router']->aliasMiddleware('retail_shop_guard', \Stegback\RetailShop\middleware\StoreGuardAuthMiddleware::class); } public function register() { // } }
5. 路由配置
Route::middleware('auth:retail_shop')->prefix('/retail-shop')->name('ReatilShop.')->group(function () { Route::get('/logout', [StoreAuth::class, 'logout'])->name('logout'); Route::get('/dashboard', [StoreDashboard::class, 'store_dashboard'])->name('store-dashboard'); Route::get('/wallet', [StoreDashboard::class, 'wallet'])->name('store-wallet'); });
原因分析及解决方案
1. 未明确指定守卫获取用户
默认auth()方法会使用web守卫,必须在控制器方法中明确指定retail_shop守卫:
public function store_dashboard() { $store = auth('retail_shop')->user(); if (!$store) { return redirect()->route('retail-shop.login'); } // 业务逻辑 }
2. 模型守卫属性未正确识别
显式在Store模型中添加getAuthGuard()方法,确保守卫关联正确:
namespace Stegback\RetailShop\Models; use Illuminate\Foundation\Auth\User as Authenticatable; class Store extends Authenticatable { protected $guard = 'retail_shop'; public function getAuthGuard() { return $this->guard; } // 原有属性... }
3. 路由加载顺序问题
调整服务提供者中路由加载时机,确保在应用路由之前初始化:
public function boot() { $this->app->booted(function () { $this->loadRoutesFrom(__DIR__ . '/routes/retail-shop-routes.php'); }); // 其他boot逻辑... }
4. 会话缓存或配置问题
清除会话和缓存,确保会话存储正常:
php artisan cache:clear php artisan session:clear
5. 路由名称拼写错误
路由组名称ReatilShop.存在拼写错误,修正为RetailShop.,避免隐性问题:
Route::middleware('auth:retail_shop')->prefix('/retail-shop')->name('RetailShop.')->group(function () { // 路由定义... });
内容的提问来源于stack exchange,提问作者Kartik Mandothiya
相关产品推荐
相关产品推荐

