【问题标题】:How to use middleware for multiple type of admins in laravel?如何在 laravel 中为多种类型的管理员使用中间件?
【发布时间】:2018-01-13 06:06:03
【问题描述】:

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

现在在两个中间件中,一些路由可以访问这两个中间件,而有些则不能。现在发生的事情是我希望在专员中间件中不能访问管理中间件的个人路由。 这里我试过了:-

//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。提前感谢:)

【问题讨论】:

  • 为什么你的 Commissioner 中间件检查“Session::has('adminSession')”,是不是错字?应该是“Session::has('commissionerSession')”吗?
  • 不,它是 adminsession,因为 commsioner 也保存在 admin 表中并且具有不同的类型

标签: php laravel laravel-5.2 laravel-middleware


【解决方案1】:

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

以下是我的建议:

  1. 创建三个不同的中间件:
    • AdminAuth 中间件(在 Http/Kernel.php 中将其命名为“admin”),用于对 master 和 Commissioner 进行身份验证。
    • 主中间件(在 Http/Kernel.php 中将其命名为“主”)检查主中间件类型 admin。
    • Commissioner 中间件(在 Http/Kernel.php 中将其命名为“commissioner”)检查专员类型 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);
    }
}
  1. 如下所示更新您的路线:

路线:

//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');
});

顺便说一句,中间件是“与”关系。假设您的路线中有以下声明:

"middleware" => ['admin', 'commissioner']

这意味着只有通过'admin'和'commissioner'检查才能访问该路由。

【讨论】:

  • 感谢您的努力。它对我有帮助
猜你喜欢
  • 2021-02-04
  • 2016-03-18
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2017-10-12
  • 2017-05-16
相关资源
最近更新 更多