如何将多个角色添加到路由组Laravel

时间:2020-06-22 04:05:47

标签: php laravel routes middleware laravel-middleware

我正在尝试在Laravel的web文件中向路由组添加多个角色。 我想根据用户角色(例如admin部分)来保护某些路由。

某些路由需要多个角色进行访问。

角色示例:

  • SuperAdmin
  • 管理员
  • 主持人
  • 等。

这有效,登录后我可以进入管理面板,并且仅在路由组中具有 一个角色

Route::middleware(['auth','role:SuperAdmin'])->group(function () {
Secret routes..
});

如果我尝试向路由组添加更多角色,则此方法不起作用 像这样:Route::middleware(['auth','role:SuperAdmin|Admin|Moderator'])->group(function () {

请注意'role:SuperAdmin|Admin|Moderator'


这是RoleMiddleware文件:

    public function handle($request, Closure $next, $role, $permission = null)
    {
        if (!$request->user()->hasRole($role)) {
            abort(404);
        }

        if ($permission !== null && !$request->user()->can($permission)) {
            abort(404);
        }

        return $next($request);
    }

User Class具有一个称为use:HasPermissionTrait的特征

class User extends Authenticatable
{
    use Notifiable, HasPermissionsTrait, Billable;

在该HasPermissionsTrait中,我具有以下内容: 我的权限设置很好,仅关注此文件中的角色。我将“角色”逻辑移到顶部。

use App\{Role, Permission};

trait HasPermissionsTrait
{
    public function hasRole(...$roles)
    {
        foreach ($roles as $role) {
            if ($this->roles->contains('name', $role)) {
                return true;
            }
        }

        return false;
    }

    public function roles()
    {
        return $this->belongsToMany(Role::class, 'users_roles');
    }
    
    ... // Permission logic start here...
}

值得一提: 角色表为:

  • 用户
  • 角色
  • users_roles(我知道正确的命名约定应为roles_users,但此处不相关)

只需要知道如何使它在路由组中工作: 'role:SuperAdmin|Admin|Moderator'


解决方案: RoleMiddleware文件:

    public function handle($request, Closure $next, $role, $permission = null)
    {
        $role = strtolower( $request->user()->hasRole($role));
        $allowed_roles = array_slice(func_get_args(), 2);
        
        if (!$request->user()->hasRole(in_array($role, $allowed_roles))) {
            abort(404);
        }

        if ($permission !== null && !$request->user()->can($permission)) {
            abort(404);
        }

        return $next($request);
    }

可以进行这样的路线分组。 Route::middleware(['auth','role:SuperAdmin|Admin'])->group(function () {

3 个答案:

答案 0 :(得分:1)

这就是我在CheckRole Middleware

中所做的
public function handle($request, Closure $next) {
    // I'm using the api guard
    $role = strtolower( request()->user()->type );
    $allowed_roles = array_slice(func_get_args(), 2);

    if( in_array($role, $allowed_roles) ) {
        return $next($request);
    }

    throw new AuthenticationException();
}

在我的路由器文件中

Route::group(["middleware" => "role:admin,worker"], function() {

});

这可能不是完美的解决方案,至少对我有用。

答案 1 :(得分:0)

explode在您的中间件中的角色,并对照可用角色进行检查

public function handle($request, Closure $next, $role, $permission = null)
{
    $roles = is_array($role)
        ? $role
        : explode('|', $role);

    if (!$request->user()->hasRole($roles)) {
        abort(404);
    }

    if ($permission !== null && !$request->user()->can($permission)) {
        abort(404);
    }

    return $next($request);
}

答案 2 :(得分:0)

    Route::middleware(['auth'])->group(function () {
      //Routes available to super admin
      Route::middleware(['role:SuperAdmin'])->group(function () {
        //write route hear 
      });
        
      //Routes available to SuperAdmin, Admin and Moderator
      Route::middleware(['role:SuperAdmin|Admin|Moderator'])->group(function () {
        //write route hear 
      })
  });

尝试这种方式来定义路由的路由组。我已经使用了这种语法,并且可以正常工作。
在父中间件组中定义auth,在子中间件组中定义角色。