Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 具有多个角色的Laravel中间件_Php_Laravel 5.4_Laravel Blade_Laravel Middleware - Fatal编程技术网

Php 具有多个角色的Laravel中间件

Php 具有多个角色的Laravel中间件,php,laravel-5.4,laravel-blade,laravel-middleware,Php,Laravel 5.4,Laravel Blade,Laravel Middleware,我在使用Laravel的中间件时遇到了一些问题。 让我告诉你我试图实现的基本想法: 网站上的注册用户将具有以下四种角色之一: 学生(默认):可以访问“索引”和“显示”视图 审批人:可以访问以前的,加上“概述”,“更新” 编辑器:可以访问上一个,加上“创建”、“编辑”和“存储” 管理员:可以访问所有内容 仅供参考:“概述”是一种索引视图,但仅适用于审批人角色和更高级别 你们有什么建议是最好的方法?这是我目前为止所做的,但似乎不起作用: Kernel.php protected $middlewa

我在使用Laravel的中间件时遇到了一些问题。 让我告诉你我试图实现的基本想法:

网站上的注册用户将具有以下四种角色之一:

  • 学生(默认):可以访问“索引”和“显示”视图
  • 审批人:可以访问以前的,加上“概述”,“更新”
  • 编辑器:可以访问上一个,加上“创建”、“编辑”和“存储”
  • 管理员:可以访问所有内容
  • 仅供参考:“概述”是一种索引视图,但仅适用于审批人角色和更高级别

    你们有什么建议是最好的方法?这是我目前为止所做的,但似乎不起作用:


    Kernel.php

    protected $middlewareGroups = [
    ...
        'approver+' => [
            \App\Http\Middleware\Approver::class,
            \App\Http\Middleware\Editor::class,
            \App\Http\Middleware\Admin::class,
        ],
    ];
    
    protected $routeMiddleware = [
    ...
        'student' => \App\Http\Middleware\Student::class,
        'approver' => \App\Http\Middleware\Approver::class,
        'editor' => \App\Http\Middleware\Editor::class,
        'admin' => \App\Http\Middleware\Admin::class,
    ];
    
    protected $routeMiddleware = [
        ...
        'role' => \App\Http\Middleware\Role::class,
    ];
    

    Http\Middleware\Admin.php

    public function handle($request, Closure $next)
    {
       if (Auth::check())
       {
    
            if(Auth::user()->isAdmin())
            {
                return $next($request);
            }
       }
    
        return redirect('login');
    }
    

    “用户”雄辩的模型:

    public function isAdmin()
    {
        if($this->role_id === 4)
        { 
            return true; 
        } 
        else 
        { 
            return false; 
        }
    }
    
    在Approver和Editor中间件文件中,以及在用户模型中的isApprover和isEditor函数中,我做了完全相同的操作,仅将if语句中的选中值分别编辑为2和3

    最后,以下是我在routes\web文件中所做的工作:

    Route::get('scholen', 'SchoolsController@index');
    Route::get('admin/scholen/overzicht', 'SchoolsController@overview')->middleware('approver+');
    Route::get('admin/scholen/maken', 'SchoolsController@create')->middleware('approver+');
    Route::post('scholen', 'SchoolsController@store')->middleware('approver+');
    Route::get('scholen/{id}', 'SchoolsController@show');
    Route::get('admin/scholen/{id}/bewerken', 'SchoolsController@edit')->middleware('admin');
    Route::patch('admin/scholen/{id}', 'SchoolsController@update')->middleware('admin');
    Route::delete('admin/scholen/{id}', 'SchoolsController@destroy')->middleware('admin');
    
    它还没有完全到位,但我被卡住了,因为当我以拥有批准者权限的用户身份登录并尝试访问学校概览时,它会将我重定向回主页

    总的来说,我觉得我的工作太混乱了,一点也不对。有人能给我一些建议,告诉我如何更有效地工作吗


    提前非常感谢

    您不应该为每个角色使用单独的中间件。它很快就会变得非常混乱。最好有一个单一的角色检查中间件,可以检查传递给它的任何角色

    Http\Kernel.php

    protected $middlewareGroups = [
    ...
        'approver+' => [
            \App\Http\Middleware\Approver::class,
            \App\Http\Middleware\Editor::class,
            \App\Http\Middleware\Admin::class,
        ],
    ];
    
    protected $routeMiddleware = [
    ...
        'student' => \App\Http\Middleware\Student::class,
        'approver' => \App\Http\Middleware\Approver::class,
        'editor' => \App\Http\Middleware\Editor::class,
        'admin' => \App\Http\Middleware\Admin::class,
    ];
    
    protected $routeMiddleware = [
        ...
        'role' => \App\Http\Middleware\Role::class,
    ];
    
    Http\Middleware\Role.php

    public function handle($request, Closure $next, ... $roles)
    {
        if (!Auth::check()) // I included this check because you have it, but it really should be part of your 'auth' middleware, most likely added as part of a route group.
            return redirect('login');
    
        $user = Auth::user();
    
        if($user->isAdmin())
            return $next($request);
    
        foreach($roles as $role) {
            // Check if user has the role This check will depend on how your roles are set up
            if($user->hasRole($role))
                return $next($request);
        }
    
        return redirect('login');
    }
    
    最后,在你的网络路线

    Route::get('admin/scholen/overzicht', 'SchoolsController@overview')->middleware('role:editor,approver');
    Route::get('admin/scholen/{id}/bewerken', 'SchoolsController@edit')->middleware('role:admin');
    

    完成每个登录会话请求的句柄函数

    public function handle($request, Closure $next)
    {
        if (! Auth::check()) {
            return redirect()->route('login');
        }
    
        if (Auth::user()->role == 1) {
            return redirect()->route('superadmin');
        }
    
        if (Auth::user()->role == 5) {
            return redirect()->route('academy');
        }
    
        if (Auth::user()->role == 6) {
            return redirect()->route('scout');
        }
    
        if (Auth::user()->role == 4) {
            return redirect()->route('team');
        }
    
        if (Auth::user()->role == 3) {
            return $next($request); 
        }
    
        if (Auth::user()->role == 2) {
            return redirect()->route('admin');
        }
    }
    

    这是对fafich答复的补充

    而不是在IF的_数组中使用FOREACH,如下所示:

    if (! in_array ($ user-> hasRole ($ role), $ roles) {
    
     // returns if you dont have permission
    }
    
    return $ next ($ request);
    

    我想我把它弄得太复杂了:)这似乎很好,非常感谢!3点“…”救了我的命:)那个操作员有名字,如果我想对管理员和编辑器路由进行分组,并且两者都有不同的前缀,该怎么办?如果编辑器在URL中的日志应该是
    editor/dashboard
    ,如果管理员在URL中的日志应该是
    admin/dashboard
    。我们能实现什么?@FosAvance这个有趣的3点“…”被称为常量表达式,它可用=>PHP5.6.x;)好笑啊P