You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:24:51