无法将两个中间件分组

时间:2019-03-30 13:59:31

标签: php laravel laravel-5 crud middleware

我正在尝试在我的应用程序中实现3种用户类型,我使用的是Laravel的默认Auth。

我创建了2个额外的中间件,以实现额外的用户(管理员和Districtlogin)条件以及用户批准的中间件,并为laravel用户使用默认值

  

管理员中间件

class Admin
{
   tion handle($request, Closure $next)
    {
        if( Auth::check() && Auth::user()->isAdmin == 1)
        {
            return $next($request);
        }
            Auth::logout();
            return redirect('login')->with('error','You have not admin access');
        }
}
  

Districtlogin中间件

class Districtlogin
{
    public function handle($request, Closure $next)
    {
        if (Auth::check() && Auth::user()->isAdmin == 2) {
            return $next($request);
        }
        Auth::logout();
        return redirect('login')->with('error', 'You have not admin access');
    }
}
  

另一个用于检查用户是否被批准的中间件

class ApproveUser
{

    public function handle($request, Closure $next)
    {

        if( Auth::check() && Auth::user()->row_status == 1)
    {
        return $next($request);

    }
            return redirect('/userapprove');

    }

我能够根据登录名重定向他们

  

Auth / LoginController

 public function redirectPath()
    {
        if (Auth::user()->isAdmin == 1 && Auth::user()->row_status == 1) {
            return '/adminindex';
        } elseif (Auth::user()->row_status == 0) {
            return '/userapprove';
        } elseif (Auth::user()->isAdmin == 2 && Auth::user()->row_status == 1) {
            return '/districtindex';
        }
        return '/engineerdashboard';
    }

这是我的

  

kernel.php

进入

'admin' => \App\Http\Middleware\Admin::class,
'districtlogin' => \App\Http\Middleware\Districtlogin::class,
'userapprove' => \App\Http\Middleware\ApproveUser::class,

我想对admin和Districtlogin中间件进行分组。

我正在使用CRUD,我希望Districtlogin可以访问几个控制器-索引,存储,更新

当我尝试对中间件进行分组时,我被重定向回登录屏幕。两种中间件都不起作用

这就是我尝试过的,

1)

Route::middleware(['admin'])->group(function () {

    //Admin Dashboard
    Route::resource('adminindex', 'AdminindexController')->middleware('districtlogin');
    Route::get('adminindex/new', 'AdminindexController@admindashboard');
});

2)

Route::middleware(['admin','districtlogin'])->group(function () {

    //Admin Dashboard
    Route::resource('adminindex', 'AdminindexController');
    Route::get('adminindex/new', 'AdminindexController@admindashboard');

});

3)

 Route::middleware(['admin',''])->group(function () {

        //Admin Dashboard
        Route::resource('adminindex', 'AdminindexController');
        Route::get('adminindex/new', 'AdminindexController@admindashboard');

        Route::middleware(['districtlogin'])->group(function () {
        Route::resource('adminindex', 'AdminindexController');

           });

    });

但是当我使用“ OR”条件时,我可以访问页面

Route::group(['middleware' => ['admin' OR 'districtlogin']], function () {

    //Admin Dashboard
    Route::resource('adminindex', 'AdminindexController');
    Route::get('adminindex/new', 'AdminindexController@admindashboard');
});

两个中间件均可访问控制器。但是我如何基于中间件限制Crud函数。

我对如何实现它一无所知。

1 个答案:

答案 0 :(得分:1)

完整的答案是:

这两个中间件彼此不兼容,它们没有共同点。一个成功的地方,另一个失败,然后重定向到登录页面。

所以这解释了您问题的第一部分。

第二部分是Route::group(['middleware' => ['admin' OR 'districtlogin']] ..对于配置中间件没有意义。它等效于Route::group(['middleware' => ['admin']] ..,因为表达式'admin' OR 'districtlogin'总是求值为第一个操作数。另外,由于Laravel 不支持使用一种或另一种中间件,这是一种误导。

解决方案:

两者都使用一种可以同时支持两个选项的中间件,例如:

class AdminOrDistrictlogin
{
    public function handle($request, Closure $next)
    {
        if (Auth::check() && Auth::user()->isAdmin >= 1 ) {
            return $next($request);
        }
        Auth::logout();
        return redirect('login')->with('error', 'You have not admin access');
    }
}

entry:

'adminOrdistrict' => \App\Http\Middleware\AdminOrDistrictlogin::class,
'userapprove' => \App\Http\Middleware\ApproveUser::class,

routes

Route::middleware(['adminOrdistrict'])->group(function () {

    //Admin or District Dashboard, distignuish later in your code
    Route::resource('adminindex', 'AdminindexController');
    Route::get('adminindex/new', 'AdminindexController@admindashboard');

});

在您的控制器和视图中,通过检查Auth::user()->isAdmin值以进一步区分简单的管理员或地区来进一步完善

,如果简单管理员和地区之间的功能差异很大,请为admindistrict 创建新的和不同的路线并使用对于每种类型的用户,适当的路由组中的每个中间件。

例如:

Route::middleware(['admin'])->group(function () {

    //Admin Dashboard
    Route::resource('adminindex', 'AdminindexController');
    Route::get('adminindex/new', 'AdminindexController@admindashboard');

});

Route::middleware(['districtlogin'])->group(function () {

    //District Dashboard
    Route::resource('districtindex', 'DistrictindexController');
    Route::get('districtindex/new', 'DistrictindexController@admindashboard');

});

选择是你的:)