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

Laravel多认证:判断用户登录状态并切换导航栏显示

解决Laravel多认证场景下前端导航的动态显示问题

嘿,针对你在Laravel多认证中遇到的前端导航切换需求,我整理了一套适配你现有配置的实现方案,分控制器逻辑处理和视图模板渲染两部分来说明:

一、前端控制器(FrontendController)处理登录状态

在你的FrontendController的index方法(或其他前端页面方法)中,我们需要遍历所有自定义守卫,判断当前是否有用户登录,并获取对应守卫的仪表盘路由,最后传递到视图:

修改FrontendController的index方法:

public function index()
{
    $logos = University::orderBy('id', 'ASC')
        ->where([
            ['status', '=', 'active']
        ])
        ->limit(8)
        ->get();
        
    // 初始化登录状态变量
    $loggedInUser = null;
    $dashboardRoute = '';
    $currentGuard = '';
    
    // 遍历所有自定义守卫,检查登录状态
    $guards = ['student', 'admin', 'university', 'school', 'web'];
    foreach ($guards as $guard) {
        if (Auth::guard($guard)->check()) {
            $loggedInUser = Auth::guard($guard)->user();
            $currentGuard = $guard;
            // 根据守卫类型匹配对应仪表盘路由
            switch ($guard) {
                case 'student':
                    $dashboardRoute = route('student.index'); // 对应你的StudentController@index路由
                    break;
                case 'admin':
                    $dashboardRoute = route('admin.dashboard'); // 替换为你的管理员仪表盘路由
                    break;
                case 'university':
                    $dashboardRoute = route('university.dashboard'); // 替换为大学用户仪表盘路由
                    break;
                case 'school':
                    $dashboardRoute = route('school.dashboard'); // 替换为学校用户仪表盘路由
                    break;
                case 'web':
                    $dashboardRoute = route('user.dashboard'); // 默认web用户仪表盘路由
                    break;
            }
            break; // 找到已登录守卫后终止循环
        }
    }
    
    return view('student::index')
        ->withLogos($logos)
        ->with('loggedInUser', $loggedInUser)
        ->with('dashboardRoute', $dashboardRoute)
        ->with('currentGuard', $currentGuard);
}

二、视图模板中动态渲染导航

在你的前端视图(比如公共导航模板或student::index页面)中,使用Blade语法判断登录状态,动态切换导航项:

<!-- 导航栏示例 -->
<nav class="navbar">
    <ul class="nav-links">
        <li><a href="/">首页</a></li>
        <!-- 动态导航逻辑 -->
        @if($loggedInUser)
            <!-- 已登录状态:显示欢迎语+仪表盘链接 -->
            <li>
                <a href="{{ $dashboardRoute }}">
                    欢迎, {{ $loggedInUser->first_name ?? $loggedInUser->name }}! 我的仪表盘
                </a>
            </li>
            <!-- 退出登录按钮(匹配当前守卫) -->
            <li>
                <form action="{{ route($currentGuard.'.logout') }}" method="POST">
                    @csrf
                    <button type="submit" class="logout-btn">退出登录</button>
                </form>
            </li>
        @else
            <!-- 未登录状态:显示各类用户登录入口 -->
            <li><a href="/student/login">学生登录</a></li>
            <li><a href="/admin/login">管理员登录</a></li>
            <li><a href="/university/login">大学登录</a></li>
            <li><a href="/school/login">学校登录</a></li>
        @endif
    </ul>
</nav>

补充:多守卫的退出路由配置

因为是多认证场景,需要给每个守卫配置独立的退出路由,在routes/web.php中添加:

// 学生退出路由
Route::post('/student/logout', function () {
    Auth::guard('student')->logout();
    return redirect('/');
})->name('student.logout');

// 管理员退出路由
Route::post('/admin/logout', function () {
    Auth::guard('admin')->logout();
    return redirect('/');
})->name('admin.logout');

// 大学用户退出路由
Route::post('/university/logout', function () {
    Auth::guard('university')->logout();
    return redirect('/');
})->name('university.logout');

// 学校用户退出路由
Route::post('/school/logout', function () {
    Auth::guard('school')->logout();
    return redirect('/');
})->name('school.logout');

三、可选优化:全局共享登录状态

如果多个前端页面都需要判断登录状态,可以在AppServiceProvider的boot方法中全局共享变量,避免重复代码:

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\View;

public function boot()
{
    View::composer('*', function ($view) {
        $loggedInUser = null;
        $dashboardRoute = '';
        $currentGuard = '';
        
        $guards = ['student', 'admin', 'university', 'school', 'web'];
        foreach ($guards as $guard) {
            if (Auth::guard($guard)->check()) {
                $loggedInUser = Auth::guard($guard)->user();
                $currentGuard = $guard;
                // 路由匹配逻辑同控制器部分
                switch ($guard) {
                    case 'student':
                        $dashboardRoute = route('student.index');
                        break;
                    case 'admin':
                        $dashboardRoute = route('admin.dashboard');
                        break;
                    // 其他守卫路由配置
                }
                break;
            }
        }
        
        $view->with(compact('loggedInUser', 'dashboardRoute', 'currentGuard'));
    });
}

这样所有视图都能直接使用这三个变量,无需在每个控制器中重复传递。


内容的提问来源于stack exchange,提问作者bhattraideb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:24:18