1

我的应用程序有三种类型的用户,每一种都有自己的dashboard. 我需要检查管理员任何其他用户都看不到其他用户仪表板。

有一个中间件RedirectIfAuthenticated

public function handle($request, Closure $next, $guard = null){

    if (Auth::guard($guard)->check() && auth()->user()->type == 'admin'){
        return redirect('/admin');
    }

    if (Auth::guard($guard)->check() && auth()->user()->type == 'author'){
        return redirect('/author');
    }

    if (Auth::guard($guard)->check() && auth()->user()->type == 'client'){
        return redirect('/client');
    }
}

它在guest中间件下。

上面的代码对我来说似乎很好,但是当我测试它时,浏览器说Too many redirects

我做错了什么,最好的处理方法是什么。

4

5 回答 5

5

您可能误解了该中间件的用途。的目的RedirectIfAuthenticated是将用户重定向到他们的默认身份验证页面。这并不意味着阻止未经身份验证/未经授权的用户访问特定区域。

如果未经授权,您需要做的是重定向。由于这是一个简单的案例,您可以只使用一个中间件:

class RequireRole {
     public function handle($request, Closure $next, $role) {
          abort_unless(auth()->check() && auth()->user()->type == $role, 403, "You don't have permissions to access this area");
           return $next($request);
     }
}

然后在你的注册这个中间件Kernel.php

protected $routeMiddleware = [
        //Other middleware
        "requirerole" => RequireRole::class
];

然后你可以在你的路线中使用它,例如

Route::get('/admin', function () { /* action */ })->middleware("requirerole:admin");

但是,如果您发现自己需要更复杂的规则,请查看授权

于 2017-09-13T12:12:27.827 回答
0

需要稍微修改一下代码

public function handle($request, Closure $next, $guard = null){

        if (Auth::guard($guard)->check() && auth()->user()->type == 'admin'){
            return redirect('/admin');
        }

        if (Auth::guard($guard)->check() && auth()->user()->type == 'author'){
            return redirect('/author');
        }

        if (Auth::guard($guard)->check() && auth()->user()->type == 'client'){
            return redirect('/client');
        }
        return $next($request);
}
于 2017-09-13T11:51:43.787 回答
0

您必须为每个 if 语句添加一个额外的检查,以查看您是否已经在它要重定向到的路线上

也许是这样的:

&& $request->is('admin')
于 2017-09-13T11:52:00.377 回答
0

只需拆分支票并保留原始回报:

     public function handle($request, Closure $next, $guard = null){
             if (Auth::guard($guard)->check()){

               if(Auth::user()->type == 'admin'){
                    return redirect('/admin');
               }
               if(Auth::user()->type == 'author'){
                    return redirect('/author');
               }
               if(Auth::user()->type == 'client'){
                    return redirect('/client');
               }
            }
            return $next($request);
    }
于 2017-09-13T11:56:49.577 回答
0

正如在接受的答案中指出的那样,中间件的目的是在用户通过身份验证时重定向用户。

现在,如果您检查App\Http\Kernel.php,您将看到中间件已附加到guest路由中间件变量。

因此,经过身份验证的用户将无法访问您分配来宾中间件的任何路由。

要解决您的问题,请创建另一个中间点,如已接受的答案中所指出的那样。

如果未经授权,您需要做的是重定向。由于这是一个简单的案例,您可以只使用一个中间件:

    public function handle($request, Closure $next, $role) {
        abort_unless(auth()->check() && auth()->user()->type == $role, 403, "You don't > have permissions to access this area");
          return $next($request);
    }
}

然后在你的 Kernel.php 中注册这个中间件

      //Other middleware
       "requirerole" => RequireRole::class
];

然后你可以在你的路线中使用它,例如

Route::get('/admin', function () { /* action */ })->middleware("requirerole:admin");

实际上,除非不可避免,否则您可能不需要修改 laravel 附带的默认文件。

于 2020-02-08T09:41:17.513 回答