【问题标题】:Own RoleMiddleware doesn't get called properly没有正确调用自己的 RoleMiddleware
【发布时间】:2017-07-16 10:48:00
【问题描述】:

就在几周前,我开始使用 Laravel,这几周我的项目取得了一些不错的进展。

3 天前,我决定在系统中为我的用户实施一些角色。

我通过 artisan 创建了一个中间件并为其编写了代码。

我的问题是将我的中间件分配给特定的路由。 首先,我将这一行添加到 Kernel.php 中的 $routeMiddleware-array 中:'role' => \App\Http\Middleware\RolesMiddleware::class,

我的routes/web.php-文件如下所示:

// Member area
Route::group(['prefix' => 'member', 'middleware' => ['auth', 'role']], function() {
    Route::get('dashboard', ['as' => 'dashboard', 'uses' => function () {
        return view('member.dashboard');
    }]);

    Route::group(['prefix' => 'user'], function() {
        Route::get('showUsers',[
            'uses' => 'UserController@showUsers',
            'as' => 'manageUsers',
            'roles' => 'manageUsers'
        ]);
    });
});

首先,我在第一组中只有“auth”中间件,我想将我的“角色”中间件作为附加操作直接添加到我的 get-route 上,例如 middleware => 'role:manageUsers'。在这种情况下,我的中间件被完全忽略并且在任何情况下都没有被调用。

在将中间件放入数组之后,就像上面的代码一样,它至少被调用了。

现在我尝试将值为“managerUsers”的自定义操作“角色”添加到我的 get-route。中间件仍会被调用,如果通过var_dump(request->route()->getAction()); 输出操作,我会看到操作“uses”和“as”,但看不到我的自定义操作“roles”。

我完全不知道出了什么问题。有谁知道是否可以将自定义操作或附加中间件添加到特定路由?

最好的问候。

编辑 1 (17.07.2017)

我的 \app\Http\Middleware\RolesMiddleware.php 看起来像这样:

namespace App\Http\Middleware;

use Closure;

class RolesMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param \string[] ...$roles
     * @return mixed
     */
    public function handle($request, Closure $next, string ...$roles)
    {
        var_dump($roles);
        die('middleware reachted');
    }
}

我的 \app\Http\Kernel.php 看起来像这样:

...
protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'role' => \App\Http\Middleware\RolesMiddleware::class,
];
...

我的 \routes\web.php 看起来像这样:

...
Route::group(['prefix' => 'member', 'middleware' => ['auth', 'role']], function() {
    ...
    Route::group(['prefix' => 'user'], function() {
        Route::get('showUsers',[
            'uses' => 'UserController@showUsers',
            'as' => 'manageUsers'
        ]);
    });
});
...

如果我将我的中间件与“auth”中间件一起分配为一个数组,我的中间件将被调用。关键是,我想定义用户在特定路线中必须拥有的角色。 (在这种情况下使用 Route::get(...))

如果我没有将我的中间件与“auth”中间件一起分配(例如,在前缀为“user”的组中),它将被完全忽略。如果我直接为我的中间件分配 get-route 也是一样的。

【问题讨论】:

    标签: laravel laravel-5.4 middleware php-7


    【解决方案1】:
    Route::group(['prefix'=>'user', 'middleware'=>'role:manageUsers'], function() {
        Route::get('/showUsers',[
            'uses' => 'UserController@showUsers',
            'as' => 'manageUsers'
        ]);
    });
    

    你的 RolesMiddleware.php:

    class RolesMiddleware{
    
        public function handle($request, Closure $next, ...$roles){
            // sent arguments are stored in $roles array
            print_r($roles); // Array ( [0] => manageUsers )
        }
    
    }
    

    【讨论】:

    • 它似乎不起作用。我将更新我上面的示例或澄清。
    【解决方案2】:

    您是否在 kernel.php 中注册了中间件?

    最好的问候...

    【讨论】:

    • '首先我将这一行添加到 Kernel.php 中的 $routeMiddleware-array 中:'role' => \App\Http\Middleware\RolesMiddleware::class,.'
    【解决方案3】:

    像往常一样,问题出在 PC 面前。

    我复制了更多路线供以后使用,但忘记更改操作数组中“as”的值。

    因为我使用模板的“as”键的值来查找正确的页面,所以我被另一条路线重定向到了预期之外。遗憾的是,这个指向相同的控制器和操作,我没有注意到浏览器地址栏中的错误 URL。

    我的角色中间件按预期工作,但我只是访问了错误的页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      相关资源
      最近更新 更多