需要关于在单个资源控制器中使用 Entrust 角色的建议 - Laravel5

Posted

技术标签:

【中文标题】需要关于在单个资源控制器中使用 Entrust 角色的建议 - Laravel5【英文标题】:Need suggestions on using Entrust roles in a single resource controller - Laravel5 【发布时间】:2016-02-08 02:45:55 【问题描述】:

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

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

我知道 entrust 带有开箱即用的中间件,非常适合我的需要。但它仅适用于路线(在这种情况下,我需要为每个角色单独的控制器)

我的 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()

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

【问题讨论】:

【参考方案1】:

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

Route::resource('users', 'UserController');

在这种情况下,我建议您使用 Entrust 提供的中间件之一作为基础并检索被调用的方法,例如如果您使用 EntrustRole:

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

【讨论】:

感谢您的回答。尽管由于应用程序的复杂性,我已经为每个角色设置了单独的控制器。但我真的很喜欢这个主意。让我们拭目以待,看看是否有人提出了新的观点。【参考方案2】:

啊..我认为这适用于您的情况。

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']]);            

    

这里user_index、user_create、user_edit等是用户模块的权限(权限表名称字段中的条目)。

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

【讨论】:

以上是关于需要关于在单个资源控制器中使用 Entrust 角色的建议 - Laravel5的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript |角 |控制器作为语法:不能使用 `this`

如何使用模型类在 laravel 8 资源控制器中编辑、销毁和获取单个值?

在 Vue JS 和 Laravel 5.1 + Entrust 中检查特定角色的权限

使用 Zizaco/entrust 包的 `name` 字段的自定义名称

关于单例

我的OpenGL学习进阶之旅关于欧拉角旋转顺序旋转矩阵四元数等知识的整理