【问题标题】:Protecting Routes with Middleware in laravel在 laravel 中使用中间件保护路由
【发布时间】:2021-09-28 13:07:39
【问题描述】:

我有一个项目,它有两个部分“管理员”和“学生”。

我想制作一个中间件,如果一个通过身份验证的用户如果他的角色是 1 自动将其重定向到管理面板,如果他的角色是 2 自动将它重定向到学生面板。 我做了这个中间件,但是当我测试它时,我有“Too Many Rediredcts”错误:

我的中间件代码:

if (auth()->check() && auth()->user()->role === 1){
        return $next($request);
    }else{
        return redirect()->route('front.index');
    }

我的路线:

我该如何解决这个问题?

【问题讨论】:

  • edit 并发布您的代码,而不是图片
  • else 语句不应该重定向到admin.index 路由吗?另外,您是否将中间件添加到 App\Http\Kernel.php 的 $routeMiddleware 数组中?
  • 是的,我在 $routeMiddleware 数组中向 Kernel.php 添加了中间件。我想如果用户角色是 1 重定向到 admin.index 并且如果用户角色是 2 重定向到 front.index

标签: laravel laravel-8 laravel-routing laravel-middleware


【解决方案1】:

我遇到了同样的问题,并通过使用类似 Url 的重定向('/admin/login')的重定向来解决它。在您的 Laravel 应用中检查并尝试以下代码。

if (auth()->check() && auth()->user()->role === 1){
    return $next($request);
}else{
    return redirect('/admin/login')->withErrors(['Access Denied']);
}

if (auth()->check() && auth()->user()->role === 1){
        return $next($request);
    }else{
        return redirect()->to('/admin/login')->withErrors(['Access Denied']);
    }

【讨论】:

    【解决方案2】:

    如果没有看到您的中间件,就很难确定问题所在,但您的其余代码看起来还不错。尝试将您的中间件更改为以下内容:

    public function handle(Request $request, Closure $next, string $roleName)
    {
        if (Auth::user()->isRole($roleName)) {
            return $next($request);
        }
    
        abort(403);
    }
    

    我们将角色从路由传递到中间件,在您的情况下,您可能会传递 admin.因此,您的任何管理路由现在都将如下所示:

    Route::middleware('checkRole:admin')->prefix('admin')->group(function () {
        Route::get('/', [BackController::class 'index'])->name('admin.index')
    });
    

    你现在将一个字符串变量传递给你的中间件$roleName

    当然,您还需要在您的 User.php 模型上实现 isRole() 方法。这将是这样的:

     /**
     * @return HasOne
     */
    public function role(): HasOne
    {
        return $this->hasOne(Role::class, 'id', 'role_id');
    }
    
    /**
     * @return bool
     */
    public function isRole($roleName): bool
    {
        $role = $this->role()->first();
        if(!is_null($role) && $role->name == $roleName) {
            return true; 
        }
        return false;
    }
    

    我假设你的User.php 模型上有一个role_id 列,你有一个Role.php 模型和name 列将匹配admin 等,你也有@987654332 @ 在Kernel.php 中类似于'checkRole' => checkRole::class, 的东西

    在 Laravel 6/Laravel 8 中测试和工作

    如果您想测试身份验证,我会更新您的路由中间件以获取数组,可能类似于:

    ['auth', 'checkRole:admin']

    在我有abort(403) 的地方,您需要一张到角色的路线图,例如:如果您是管理员return redirect()->route('admin.index')

    【讨论】:

      猜你喜欢
      • 2015-12-17
      • 2015-08-12
      • 2019-12-04
      • 2021-09-06
      • 2021-11-23
      • 1970-01-01
      • 2017-02-11
      • 2016-02-11
      • 2018-09-25
      相关资源
      最近更新 更多