如何将经过身份验证的中间件和经过角色许可的中间件一起使用?

时间:2019-02-26 20:25:06

标签: php laravel-5.7 user-roles spatie

我实际上是使用spatie来担任角色和权限的,但是我有1个我无法解决的问题,它与经过身份验证的重定向中间件有关。

我在控制器中使用角色中间件来允许或拒绝基于角色的控制器访问,因此问题在于这两个中间件之间正在进行某种重定向循环,从而导致此错误:

ERR_TOO_MANY_REDIRECTS

接下来,我的代码:

web.php:

Auth::routes();
Route::get('/', ['as'=>'index', 'uses' => 'HomeController@index']);
Route::resource('Empleados', 'EmpleadosController');
Route::resource('Tipopermisos', 'TipopermisosController');
Route::resource('Tiemposcompensatorios', 'TiemposcompensatoriosController');
Route::resource('Permisos', 'PermisosController');
Route::resource('Reportes', 'ReportesController');
Route::get('listaTC', ['as'=>'listaTC', 'uses' =>'TiemposcompensatoriosController@listaTC']);
Route::get('listaP', ['as'=>'listaP', 'uses' => 'PermisosController@listaP']);
Route::get('searchBar', ['as'=>'searchBar', 'uses' => 'PermisosController@searchBar']);
Route::get('generalReport', ['as'=>'generalReport', 'uses' =>'ReportesController@generalReport']);

HomeController:

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return redirect()->route('Empleados.index');
    }
}

RedirectIfAuthenticated.php:

class RedirectIfAuthenticated
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @param  string|null  $guard
 * @return mixed
 */
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            return redirect('/');
        }
        return $next($request);
    }
}

最后,我的EmpleadosController whit索引方法是登录名应重定向到的那个方法,我的构造函数用来验证用户是否具有访问控制器的权限:

     public function __construct()
     {
        $this->middleware(['role:superadmin|admin']);
     }
     /**
      * Display a listing of the resource.
      *
      * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        $data = strtoupper($request->buscar);
        if( strlen($data) >3){
            $empleados = Empleado::where('nombre', 'LIKE', "%{$data}%")->paginate(10);
        }
        else{
            $empleados = Empleado::paginate(10);
        }
        if ($request->ajax()) {
            return view('empleados.list', compact('empleados'))->render();
        }

        return view('empleados.index',compact('empleados'));
    }

从每次用户登录到redirectifauthenticated中间件运行时的这种行为中我可以看到,这导致我进入家庭控制器中的index方法,该方法将我重定向到EmpleadosController并再次运行角色中间件,同时再次运行角色中间件redirectifauthenticated中间件,由于这个问题,我陷入了这种重定向循环中!

如果我从控制器中删除角色中间件,它将起作用:|

我将上传您要求的所有所需代码,希望您能为我提供帮助!谢谢。

0 个答案:

没有答案
相关问题