ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php – 通过访问路由名称参数自动执行Entrust权限并检查用户的权限

2019-10-08 17:34:14  阅读:177  来源: 互联网

标签:acl php laravel-5 permissions routes


我已经为ACL层实现了Entrust Roles.现在我计划为每个请求自动执行权限检查,这样每次我都不必为用户角色写入权限.

例如.我有公司资源,用户角色为’admin’,他只能查看公司和其他用户角色,因为’超级’可以管理公司.在数据库中,我已经为他们提供了适当的权限,但在中间件中检查是否允许,我计划实现这一点:

如果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:这是实现自动角色检查的好方法,还是有其他更好的方法.

任何帮助/建议将受到高度赞赏.

解决方法:

好吧,我找到了答案,并在某种程度上我做了自动权限测试.我在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 OR 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'));
    }

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

标签:acl,php,laravel-5,permissions,routes
来源: https://codeday.me/bug/20191008/1873230.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有