Php 需要在单个资源控制器中使用委托角色的建议-Laravel5

Php 需要在单个资源控制器中使用委托角色的建议-Laravel5,php,laravel-5,acl,user-roles,Php,Laravel 5,Acl,User Roles,我正在开发一个控制面板应用程序,其中我有几个用户角色,如globaladmin、editors等。现在我想将这些角色与单个UserController资源一起使用 例如,globaladmins应该能够执行所有Restful方法,而编辑器只能查看和更新用户 我知道Trust附带现成的中间件,非常适合我的需要。但它只在路由上工作(在这种情况下,我需要为每个角色使用单独的控制器) 我的UserController看起来像这样 Class UserController extends BaseCont

我正在开发一个控制面板应用程序,其中我有几个用户角色,如globaladmin、editors等。现在我想将这些角色与单个UserController资源一起使用

例如,globaladmins应该能够执行所有Restful方法,而编辑器只能查看和更新用户

我知道Trust附带现成的中间件,非常适合我的需要。但它只在路由上工作(在这种情况下,我需要为每个角色使用单独的控制器)

我的UserController看起来像这样

Class UserController extends BaseController
{
     $protected $viewfolder;
     public function __construct
     {
        // Checking for role and then assigning the folder name of the views
        $role = User::getRole();
        switch($role)
        case 'globaladmin':
              $this->viewfolder = 'globaladmin';
              break;
        case 'editor':
              $this->viewfolder = 'editor';
              break;
        default:
              abort(401, 'Access Denied');
              break;
     }

     public function index(){
        if( Entrust::can('view-all-users') ){
            $users = User:all();
        }
        return view( $this->viewfolder.'.users.viewuser', compact('users'));
     }
     public function create()
     public function update()
     public function delete()
}

我需要在构造函数中安装一个中间件,该中间件将检查用户角色,然后仅在角色有权使用该方法时才允许使用该方法。但这应该以一种体面的方式完成,不需要任何黑客攻击,因为我也将在其他控制器上使用它。

我假设您在路由文件中使用以下内容:

Route::resource('users', 'UserController');
在这种情况下,我建议您使用委托提供的一个中间件作为基础并检索被调用的方法,例如,如果您使用委托角色:

public function handle($request, Closure $next)
{
    $controllerMethod = Route::segment(3);
    $roles = $this->retrieveRequiredRolesForMethod($method);
    if ($this->auth->guest() || !$request->user()->hasRole(explode('|', $roles))) {
        abort(403);
    }
    return $next($request);
}

当然,这只是一个提示,您应该找到一种更好的方法来提取被调用的方法,并且仍然需要实现
retrieveRequiredRolesForMethod
啊。。我想这对你的情况会有用的

class UserController extends Controller
{
    public function __construct()
    {                        
        $this->middleware('permission:user_index', ['only' => ['index']]); 
        $this->middleware('permission:user_create', ['only' => ['create', 'store']]);
        $this->middleware('permission:user_edit', ['only' => ['edit', 'update']]);
        $this->middleware('permission:user_delete', ['only' => ['delete']]);
        $this->middleware('permission:user_view', ['only' => ['show']]);            

    }
}
在这里,用户索引、用户创建、用户编辑等是用户模块的权限(权限表名称字段中的条目)


这将自动检查登录用户的能力,并相应显示页面。

谢谢您的回答。尽管由于应用程序的复杂性,我选择了另一种方式,为每个角色配备单独的控制器。但我真的很喜欢这个主意。让我们拭目以待,看看是否有人提出了新的观点。