我正在研究Laravel,并尝试制作一个ACL
系统。我有一个来自myController的角色中间件,我已经通过两种方式向我的RoleMiddleware发送了Role
。
第一个是发送字符串。
$this->middleware('HasRole:User|Admin|Author');
这样,我在使用dd()
函数时会得到一个字符串。
第二种方法是。
$this->middleware('HasRole:User,Admin,Author');
这样,我在使用dd()
函数时得到一个数组。
但是此数组仅包含一个值。
这样的结果。
array:1 [▼
0 => "User"
]
另外两个值Admin
和Author
不在此数组中。
我如何同时使用字符串和数组
这是我的中间件。
public function handle($request, Closure $next,$role='')
{
$roles=is_array($role)? $role: explode('|', $role);
dd($roles);
if($request->user()===null)
{
return response('Insufficient Access',401);
}
if($request->user()->hasAnyRole($roles) || !$roles)
{
return $next($request);
}
return response('Insufficient Permission',401);
//return $next($request);
}
答案 0 :(得分:0)
我可能不完全知道您的问题的答案,但是我建议您使用laravel授权而不是中间件。 see this doc
对于在控制器中遇到的问题,我更喜欢使用此代码:
$this->authorize('update', $post);
或:
if ($user->can('create', Post::class)) {
// Executes the "create" method on the relevant policy...
}
然后在策略文件中,应指定以下语句:
if ($user->isSuperAdmin() || $user->id === $post->user_id) {
return true;
}
答案 1 :(得分:0)
如果您希望中间件将字符串自动转换为数组,那么中间件$role
的参数应该是这样
public function handle($request, Closure $next, ...$roles)
{
dd($roles);
if($request->user()===null)
{
return response('Insufficient Access',401);
}
if($request->user()->hasAnyRole($roles) || !$roles)
{
return $next($request);
}
return response('Insufficient Permission',401);
//return $next($request);
}
然后像这样$this->middleware('HasRole:User,Admin,Author');
OR
但是,如果您希望其他字符分隔您的角色,例如|
,则代码应为
public function handle($request, Closure $next, $role = '')
{
$roles = explode('|', $role);
dd($roles);
if($request->user()===null)
{
return response('Insufficient Access',401);
}
if($request->user()->hasAnyRole($roles) || !$roles)
{
return $next($request);
}
return response('Insufficient Permission',401);
//return $next($request);
}
并像$this->middleware('HasRole:User|Admin|Author');
答案 2 :(得分:0)
您可以同时使用两者,只需在中间件中添加一些代码即可。
public function handle($request, Closure $next,...$role)
{
//add two line
$str_role=explode('|',$role[0]);
$roleString=$str_role;
$roles=is_array($role)? $role : is_array($roleString)? $roleString : null;
//dd($roles);
if($request->user()===null)
{
return response('Insufficient Access',401);
}
if($request->user()->hasAnyRole($roles) || !$roles)
{
return $next($request);
}
return response('Insufficient Permission',401);
//return $next($request);
}
现在,您可以使用。
$ this-> middleware('HasRole:User | Admin | Author');
OR
$ this-> middleware('HasRole:User,Admin,Author');