通过访问路由名称参数自动委托权限并检查用户权限
Automate Entrust permission with accessing the Route name parameters and check for user's permission
我已经为 ACL 层实现了委托角色。现在我计划对每个请求自动进行权限检查,这样每次我都不必为用户角色编写权限。
例如。我有公司资源,用户角色为'admin',他只能查看公司,另一个用户角色为'super'可以管理公司。在数据库中,我已经为他们提供了适当的权限,但在中间件中检查那里的权限,我打算实现这个:
如果 url 变为:localhost/company/create - 在数据库中的权限将为 create_company,并且将根据此权限检查当前登录的用户。
$user->can('create_company') OR
$user->can(['create_company', 'view_company']);
Que1:是否可以通过中间件实现此目的,其中路由名称 eg.company.create、company.show 是可访问的(因此点被替换为“_”,我们可以检查权限)?怎么样?
问题2:这是实现自动角色检查的好方法还是有其他更好的方法。
任何 help/suggestion 将不胜感激。
好吧,我找到了答案,并且在某种程度上我已经进行了自动化权限测试。我在 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;
}
这个return我是基于请求方法的权限。例如。 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'));
}
这样,如果用户未被授权,他将被重定向到仪表板(主页)页面,超级用户将不会面临任何此类身份验证,因此他被排除在外。
我已经为 ACL 层实现了委托角色。现在我计划对每个请求自动进行权限检查,这样每次我都不必为用户角色编写权限。
例如。我有公司资源,用户角色为'admin',他只能查看公司,另一个用户角色为'super'可以管理公司。在数据库中,我已经为他们提供了适当的权限,但在中间件中检查那里的权限,我打算实现这个:
如果 url 变为:localhost/company/create - 在数据库中的权限将为 create_company,并且将根据此权限检查当前登录的用户。
$user->can('create_company') OR
$user->can(['create_company', 'view_company']);
Que1:是否可以通过中间件实现此目的,其中路由名称 eg.company.create、company.show 是可访问的(因此点被替换为“_”,我们可以检查权限)?怎么样?
问题2:这是实现自动角色检查的好方法还是有其他更好的方法。
任何 help/suggestion 将不胜感激。
好吧,我找到了答案,并且在某种程度上我已经进行了自动化权限测试。我在 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;
}
这个return我是基于请求方法的权限。例如。 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'));
}
这样,如果用户未被授权,他将被重定向到仪表板(主页)页面,超级用户将不会面临任何此类身份验证,因此他被排除在外。