自动委托权限访问路由名称参数,并检查用户的权限


Automate Entrust permission with accessing the Route name parameters and check for user's permission

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

。我有公司资源,用户角色为"admin",他只能查看公司,另一个用户角色为"super"可以管理公司。在数据库中,我为他们提供了适当的权限,但在中间件中检查权限,我计划实现这一点:

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

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

Que1:是否有可能通过中间件实现这一点,其中路由名称(例如company.create, company.create)。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或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'));
    }

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