Php 如何在laravel中为多种类型的管理员使用中间件?

Php 如何在laravel中为多种类型的管理员使用中间件?,php,laravel,laravel-5.2,laravel-middleware,Php,Laravel,Laravel 5.2,Laravel Middleware,我在laravel中使用中间件。我有两个中间件,一个是管理员,另一个是专员 现在,在这两个中间件中,有些路由同时访问中间件,有些路由不访问中间件。现在发生的事情是,我不想在commissioner中间件中访问管理中间件的个人路由。 在这里,我试过:- //Admin Middleware Route Route::group(["middleware" => ['admin']], function () { Route::match(['get', 'post'], '/admi

我在laravel中使用中间件。我有两个中间件,一个是管理员,另一个是专员

现在,在这两个中间件中,有些路由同时访问中间件,有些路由不访问中间件。现在发生的事情是,我不想在commissioner中间件中访问管理中间件的个人路由。 在这里,我试过:-

//Admin Middleware Route
Route::group(["middleware" => ['admin']], function () {
    Route::match(['get', 'post'], '/admin/users', 'AdminController@users');
});
//Commissioner Middleware Route
Route::group(["middleware" => ['commissioner']], function () {
 //we can put later on these routes
});

// common middleware routes between commissioner and admin
Route::group(["middleware" => ['admin','commissioner']], function () {
    Route::match(['get', 'post'], '/admin/dashboard', 'AdminController@dashboard');
    Route::match(['get', 'post'], '/admin/profile', 'AdminController@profile');
});
现在,当我访问AdminController@users当我通过专员登录时,可以访问该路线,但我希望专员登录时不访问该路线。但是AdminController@dashboardAdminController@profile应可在两个中间件中访问

When admin login then  type is : master
when commsioner login then type  is : commissioner

// Commissioner Middleware
class Commissioner
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    if(empty(Session::has('adminSession'))){
        return redirect()->action('AdminController@login')->with('flash_message_error', 'Please Login');
    }
    return $next($request);
}
}

// admin Middleware
class Admin
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    if(empty(Session::has('adminSession'))){
        return redirect()->action('AdminController@login')->with('flash_message_error', 'Please Login');
    }
    return $next($request);
}
}

请帮助我,我正在使用laravel 5.2。感谢您的建议:)

如果我正确理解您的问题,您有一个管理表,其中包含两种不同类型的管理员:master和commission。 这两种类型的管理员都是通过invoke登录的AdminController@login方法。您希望使用中间件来检查管理员的类型,以保护您的路由

以下是我的建议:

  • 创建三种不同的中间件:
    • AdminAuth中间件(在Http/Kernel.php中将其命名为“admin”),用于对master和commission进行身份验证检查
    • 主中间件(在Http/Kernel.php中将其命名为“Master”)检查主类型admin
    • 专员中间件(在Http/Kernel.php中将其命名为“专员”)检查专员类型admin
  • 中间商:

    class AdminAuth
    {
        public function handle($request, Closure $next)
        {
            if(!Session::has('adminSession')){
                return redirect()->action('AdminController@login')->with('flash_message_error', 'Please Login');
            }
            return $next($request);
        }
    }
    
    class Master
    {
        public function handle($request, Closure $next)
        {
            $admin = ... // Your code to retrived authenticated admin instance.
            if($admin->type !== 'master') { // I assume you have a type field.
                // return error here to indicate user is not a master
            }
            return $next($request);
        }
    }
    
    class Commissioner
    {
        public function handle($request, Closure $next)
        {
            $admin = ... // Your code to retrived authenticated admin instance.
            if($admin->type !== 'commissioner') { // I assume you have a type field.
                // return error here to indicate user is not a commissioner
            }
            return $next($request);
        }
    }
    
  • 按如下方式更新您的路线:
  • 路线:

    //Admin Middleware Route can only be accessed by master admin
    Route::group(["middleware" => ['admin', 'master']], function () {
        Route::match(['get', 'post'], '/admin/users', 'AdminController@users');
    });
    
    //Commissioner Middleware Route
    Route::group(["middleware" => ['admin', 'commissioner']], function () {
        //we can put later on these routes
    });
    
    // common middleware routes between commissioner and admin
    Route::group(["middleware" => ['admin']], function () {
        Route::match(['get', 'post'], '/admin/dashboard', 'AdminController@dashboard');
        Route::match(['get', 'post'], '/admin/profile', 'AdminController@profile');
    });
    
    顺便说一句,中间产品是“和”关系。假设您在路线中有以下声明:

    “中间件”=>[“管理员”、“专员”]


    这意味着只有当您通过“管理员”和“专员”检查时,才能访问该路由

    如果我正确理解您的问题,您有一个管理表,其中包含两种不同类型的管理员:master和commission。 这两种类型的管理员都是通过invoke登录的AdminController@login方法。您希望使用中间件来检查管理员的类型,以保护您的路由

    以下是我的建议:

  • 创建三种不同的中间件:
    • AdminAuth中间件(在Http/Kernel.php中将其命名为“admin”),用于对master和commission进行身份验证检查
    • 主中间件(在Http/Kernel.php中将其命名为“Master”)检查主类型admin
    • 专员中间件(在Http/Kernel.php中将其命名为“专员”)检查专员类型admin
  • 中间商:

    class AdminAuth
    {
        public function handle($request, Closure $next)
        {
            if(!Session::has('adminSession')){
                return redirect()->action('AdminController@login')->with('flash_message_error', 'Please Login');
            }
            return $next($request);
        }
    }
    
    class Master
    {
        public function handle($request, Closure $next)
        {
            $admin = ... // Your code to retrived authenticated admin instance.
            if($admin->type !== 'master') { // I assume you have a type field.
                // return error here to indicate user is not a master
            }
            return $next($request);
        }
    }
    
    class Commissioner
    {
        public function handle($request, Closure $next)
        {
            $admin = ... // Your code to retrived authenticated admin instance.
            if($admin->type !== 'commissioner') { // I assume you have a type field.
                // return error here to indicate user is not a commissioner
            }
            return $next($request);
        }
    }
    
  • 按如下方式更新您的路线:
  • 路线:

    //Admin Middleware Route can only be accessed by master admin
    Route::group(["middleware" => ['admin', 'master']], function () {
        Route::match(['get', 'post'], '/admin/users', 'AdminController@users');
    });
    
    //Commissioner Middleware Route
    Route::group(["middleware" => ['admin', 'commissioner']], function () {
        //we can put later on these routes
    });
    
    // common middleware routes between commissioner and admin
    Route::group(["middleware" => ['admin']], function () {
        Route::match(['get', 'post'], '/admin/dashboard', 'AdminController@dashboard');
        Route::match(['get', 'post'], '/admin/profile', 'AdminController@profile');
    });
    
    顺便说一句,中间产品是“和”关系。假设您在路线中有以下声明:

    “中间件”=>[“管理员”、“专员”]


    这意味着只有当您通过“管理员”和“专员”检查时,才能访问该路由

    为什么您的专员会检查“Session::has('adminSession')”,这是一个打字错误吗?是否应该是“Session::has('commissionerSession')”?不,它是adminsession,因为Commissioner也保存在admin表中,并且具有不同的类型为什么您的专员中间件检查“Session::has('adminsession')”,这是一个打字错误吗?应该是“Session::has('commissionerSession')”?不,它是adminsession,因为Commissioner也保存在admin表中,并且具有不同的类型谢谢您的努力。这对你的努力很有帮助。这对我有帮助