【问题标题】:How to add multiple roles to a route group laravel如何将多个角色添加到路由组 laravel
【发布时间】:2020-10-11 21:24:40
【问题描述】:

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

某些路由需要多个角色才能访问。

示例角色:

  • 超级管理员
  • 管理员
  • 版主
  • 等等..

这行得通,如果我登录后我可以进入管理面板,并且只有在路由组中具有一个角色

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'


解决方案: 角色中间件文件:

    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 () {

【问题讨论】:

标签: php laravel routes middleware laravel-middleware


【解决方案1】:

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

【讨论】:

  • 得到错误Call to undefined method App\User::hasAnyRole(),因为我没有那个方法。 hasAnyRoute 包含什么。它在 Trait 中吗?
  • @echo 使用 hasRole 方法检查
  • 仍然得到abort(404) 在路线中这样做:Route::middleware(['auth','role:SuperAdmin|Admin'])->group(function () {
  • @echo 你能在你的中间件中做一个dd($role) 并发布回复
  • 实际上刚刚开始工作。在问题中发表了我的灵魂。让我知道你的想法。感谢您的帮助。
【解决方案2】:
    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 
      })
  });

尝试这种方式来定义路由的路由组。我已经使用了这种语法并且它的工作。
在父中间件组中定义身份验证,在子中间件组中定义角色。

【讨论】:

  • 这是我想要的。尝试了您的解决方案,但仍从 abort(404); 中返回 404
【解决方案3】:

这就是我在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() {

});

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

【讨论】:

  • 哇,经过一点调整后,这实际上奏效了。谢谢!
  • 我在问题的底部添加了我的解决方案。
猜你喜欢
  • 2016-03-28
  • 2016-06-09
  • 2019-09-21
  • 2016-08-16
  • 2017-10-02
  • 2016-03-31
  • 2017-05-22
  • 2021-02-08
  • 2016-03-30
相关资源
最近更新 更多