【问题标题】:Automate Entrust permission with accessing the Route name parameters and check for user's permission通过访问路由名称参数自动委托权限并检查用户的权限
【发布时间】:2015-07-25 23:16:07
【问题描述】:

我已经为 ACL 层实现了委托角色。现在我计划自动检查每个请求的权限,这样每次我都不必为用户角色编写权限。

例如。我有公司资源,用户角色为“管理员”,他只能查看公司,另一个用户角色为“超级”可以管理公司。在数据库中,我为他们提供了适当的权限,但在中间件中检查权限,我打算实现这一点:

如果 url 变为:localhost/company/create - 在 DB 中的权限将是 create_company,并且将根据此权限检查当前登录的用户。

$user->can('create_company')  OR
$user->can(['create_company', 'view_company']);

Que1:这是否可以通过中间件来实现,其中可以访问路由名称 eg.company.create、company.show(以便将点替换为 '_' 并且我们可以检查权限)?怎么样?

Que2:这是实现自动角色检查的好方法还是有其他更好的方法。

任何帮助/建议将不胜感激。

【问题讨论】:

    标签: php permissions routes laravel-5 acl


    【解决方案1】:

    好吧,我找到了答案,并且在某种程度上我已经进行了自动化权限测试。我在Authenticate.php中间件中创建了一个函数

    public function autocheckroles($request)
    {
        $perms = '';
        $delimiter = '_'.$request->segment(1);
        if($request->isMethod('GET')){
    
            if(is_numeric($request->segment(2)) && is_null($request->segment(3))){
                $perms = 'show'.$delimiter; 
            }
            elseif($request->segment(3) == 'edit' && 
                is_numeric($request->segment(2))){
                $perms = 'edit'.$delimiter;
            }
            elseif ($request->segment(2) == 'create'){
                $perms = 'create'.$delimiter;
            }
            elseif(is_null($request->segment(2)) && is_null($request->segment(3)) &&
                ! is_null($request->segment(1))){
                $perms = 'view'.$delimiter;
            } 
        }
        elseif($request->isMethod('POST')){
            if($request->segment(1)){
                $perms = 'create'.$delimiter;
            }           
        }
        elseif($request->isMethod('DELETE')){
            $perms = 'delete'.$delimiter;
        }
        elseif($request->isMethod('PUT') || $request->isMethod('PATCH')){
            if($request->segment(1)){
                $perms = 'edit'.$delimiter;
            }
        }
        return $perms;
    }
    

    这会根据请求方法返回我的权限。例如。 create_perm 或 create_role 或 edit_role。这样,我就没有在中间件中编写每一个权限。它会根据请求自动检查。

    // Check for the user role and automate the role permission
        $perform_action = $this->autocheckroles($request);
        // Super Admin with id number 1 dosen't require any permission
        if((\Auth::user()->id == '1') || \Auth::user()->can($perform_action)){
            return $next($request);
        }
        else
        {
            \Session::flash('flash_message', 'You are not authorized for this page.');
            return new RedirectResponse(url('/home'));
        }
    

    这样,如果用户未经授权,他将被重定向到仪表板(主页)页面,超级用户将不会面临任何此类身份验证,因此他被排除在外。

    【讨论】:

    • Tarunn,我所做的编辑是remove noise from your answer。一些称呼会被自动删除,而像这样的其他称呼则留给编辑整理,同时保留帖子中的信息。 Stack Overflow 不是论坛。没有必要要求人们以更好的答案做出回应,因为对此总是有公开的邀请。加上“谢谢”,您的答案就会出现在可能值得删除的帖子列表中;我的编辑旨在保留您的答案。如果您想保持原样,那是您的选择。
    猜你喜欢
    • 2018-05-11
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    相关资源
    最近更新 更多