【问题标题】:Mutilple middlewares for routes didn't works路由的多个中间件不起作用
【发布时间】:2018-01-03 16:14:53
【问题描述】:

我正在使用 Laravel 5.5。

我创建了 4 个中间件,一个按用户角色创建的中间件。

管理员与员工拥有相同的权限。但是,管理员拥有更多权限。

路由文件:

Route::group(['prefix' => 'admin'], function() {

    // EMPLOYEE AND ADMIN ROUTES
    Route::group(['middleware' => ['admin', 'employe']], function() {
         Route::get('showCreationSeance', 'AdministrationController@showCreationSeance');
         Route::get('showAjoutCoach', 'AdministrationController@showAjoutCoach');
         Route::get('showReservationClient', 'AdministrationController@showReservationClient');
         Route::get('showAnnulationClient', 'AdministrationController@showAnnulationClient');

         Route::post('creerSeance', 'AdministrationController@creerSeance')->name('admin/creerSeance');
         Route::post('ajouterCoach', 'AdministrationController@ajouterCoach')->name('admin/ajouterCoach');
    });

    // ADMIN ROUTES
    Route::group(['middleware' => 'admin'], function() {
         Route::get('showCreationActivite', 'AdministrationController@showCreationActivite');
         Route::get('showAjoutEmploye', 'AdministrationController@showAjoutEmploye');

         Route::post('creerActivite', 'AdministrationController@creerActivite')->name('admin/creerActivite');
         Route::post('ajouterEmploye', 'AdministrationController@ajouterEmploye')->name('admin/ajouterEmploye');
     });
});

中间件:

class AdminMiddleware
{
    public function handle($request, Closure $next)
    {
        $user = User::getUser(Auth::user()->id_utilisateur);

        if(!$user->estAdmin()) {
            throw new AuthorizationException();
        }

        return $next($request);
    }
}

class EmployeMiddleware
{
    public function handle($request, Closure $next)
    {
        $user = User::getUser(Auth::user()->id_utilisateur);

        if(!$user->estEmploye()) {
            throw new AuthorizationException();
        }

        return $next($request);
    }
}

用于中间件的方法:

public function estAdmin() {
    $idStatutAdmin = Statut::select('id_statut')
        ->where('nom_statut', '=', 'ROLE_ADMIN')
        ->first();

    return ($idStatutAdmin->id_statut == $this->id_statut) ? true : false;
}

public function estEmploye() {
    $idStatutEmployee = Statut::select('id_statut')
        ->where('nom_statut', '=', 'ROLE_EMPLOYEE')
        ->first();

    return ($idStatutEmployee->id_statut == $this->id_statut) ? true : false;
}

堆栈跟踪:

Illuminate\Foundation\Exceptions\Handler render
…/app/Exceptions/Handler.php 51

Illuminate\Auth\Access\AuthorizationException 
…/app/Http/Middleware/AdminMiddleware.php 25

Illuminate\Foundation\Http\Kernel handle
…/public/index.php 55

问题: 为管理员和员工定义的路由不起作用,我收到一个错误:

Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException

没有消息

虽然管理员的路由只能完美运行。你能告诉我这样做是否正确吗?

当我以管理员身份连接时,EmployeMiddleware 会引发错误。当我以员工身份连接时,AdminMiddleware 会引发错误。

感谢您的帮助!

【问题讨论】:

  • 您是否尝试缩小引发异常的范围?
  • 是的,它在 AdminMiddleware 上。我认为这是因为连接的用户是员工。有可能吗?
  • 我不知道,你还没有发布你的中间件的代码。
  • @JimWright 我用中间件代码更新了我的问题。如果您需要更多代码,请告诉我。
  • 嗨@N.Lamblin,您能否也发布您的堆栈跟踪以查找错误?这将有助于缩小导致错误的范围。

标签: php laravel laravel-5 middleware


【解决方案1】:

用户的id_statut 列只能是ROLE_ADMIN 或ROLE_EMPLOYEE。举个例子:

$roles = [
    'admin' => 2,
    'employee' => 1
];

$user = [
    'id_statut' => 1
];

if ($user['id_statut'] == $roles['employee']) {
    // User is an employee - this code will execute
}
if ($user['id_statut'] == $roles['admin']) {
    // User is not an admin - this code will NOT execute
}
if ($user['id_statut'] == $roles['employee'] && $user['id_statut'] == $roles['employee']) {
    // User is an employee AND an admin
    // This is impossible based on your database structure as id_statut cannot be both 1 and 2
}

一个简单的解决方案是检查用户是否是estEmploye() 中的员工或更高权限。例如:

public function estEmploye() {
    $idStatutEmployee = Statut::select('id_statut')
        ->where('nom_statut', 'IN', ['ROLE_EMPLOYEE', 'ROLE_ADMIN'])
        ->get('id_statut');
    return in_array($this->id_status, $idStatutEmployee);
}

【讨论】:

  • 感谢您的回答!只是,$idStatutEmployee 是一个对象,in_array() 需要一个数组。我不得不编辑我的路由文件并将Route::group(['middleware' => ['admin', 'employe']], function() { 替换为Route::group(['middleware' => 'employe'], function() {。
  • 这只会确保用户是员工,我认为重点是您希望他们成为管理员和员工?
  • 为此,我也更新了员工中间件。 if($user->estEmploye() || $user->estAdmin()) 因为管理员是员工。
猜你喜欢
  • 2018-05-11
  • 2018-10-25
  • 2021-04-25
  • 2018-07-21
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多