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

登录后如何限制不同用户访问指定目录?附登录控制器代码

实现登录后用户目录权限控制方案

看起来你已经在登录环节做了基础的角色跳转,但要彻底实现用户只能访问专属目录、禁止未授权访问,还需要补充路由层面的权限校验逻辑,我结合Laravel框架给你梳理完整步骤:

1. 创建权限校验中间件

首先我们需要一个中间件来拦截所有目录访问请求,检查当前用户是否有权限进入该目录:

运行命令生成中间件:

php artisan make:middleware CheckPermission

打开app/Http/Middleware/CheckPermission.php,写入以下逻辑:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class CheckPermission
{
    public function handle(Request $request, Closure $next, $directory)
    {
        $user = Auth::user();
        
        // 定义不同角色允许访问的目录列表
        $allowedDirs = match(true) {
            $user->roles->pluck('name')->contains('Admin') => ['issuer', 'admin-panel'],
            $user->roles->pluck('name')->contains('Approver') => ['approver'],
            default => ['user-home'] // 普通用户默认目录
        };

        // 如果请求的目录不在允许列表里,返回403无权限
        if (!in_array($directory, $allowedDirs)) {
            abort(403, '抱歉,你没有权限访问该目录');
        }

        return $next($request);
    }
}

2. 注册中间件

打开app/Http/Kernel.php,在$routeMiddleware数组里添加我们的中间件:

protected $routeMiddleware = [
    // 其他默认中间件...
    'check.permission' => \App\Http\Middleware\CheckPermission::class,
];

3. 给目录路由绑定权限校验

接下来把中间件绑定到对应目录的路由组上,确保只有授权用户能访问:

// Admin专属目录路由
Route::prefix('issuer')
    ->middleware(['auth', 'check.permission:issuer'])
    ->group(function () {
        Route::get('/', [IssuerController::class, 'index']);
        // 这里添加issuer目录下的所有子路由
    });

// Approver专属目录路由
Route::prefix('approver')
    ->middleware(['auth', 'check.permission:approver'])
    ->group(function () {
        Route::get('/', [ApproverController::class, 'index']);
        // 这里添加approver目录下的所有子路由
    });

4. 优化登录跳转逻辑

完善你现有的sendLoginResponse方法,确保用户登录后只能跳转到自己有权限的目录:

protected function sendLoginResponse(Request $request) { 
    $request->session()->regenerate(); 
    $this->clearLoginAttempts($request); 

    $user = $this->guard()->user();
    $redirectPath = '/home'; // 默认跳转路径

    // 根据用户角色匹配正确的跳转目录
    foreach ($user->roles as $role) {
        if ($role->name == 'Admin') {
            $redirectPath = 'issuer';
            break;
        } elseif ($role->name == 'Approver') {
            $redirectPath = 'approver';
            break;
        }
    }

    return redirect($redirectPath);
}

额外注意事项

  • 如果你的User模型和Role模型是多对多关联,可以在User模型里加一个便捷方法来简化角色判断:
    public function hasRole($roleName)
    {
        return $this->roles()->where('name', $roleName)->exists();
    }
    
    这样中间件里的判断可以改成$user->hasRole('Admin'),代码更简洁。
  • 记得处理用户没有任何角色的边界情况,避免出现无跳转目标的问题。
  • 如果需要更细粒度的资源权限控制(比如目录内的某个操作),可以结合Laravel的**策略(Policy)**来实现。

内容的提问来源于stack exchange,提问作者R. Mseti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:17:34