【发布时间】:2020-10-11 21:24:40
【问题描述】:
我正在尝试在 Laravel 的 web 文件中的路由组中添加多个角色。
我想根据用户角色保护某些路由,例如管理部分。
某些路由需要多个角色才能访问。
示例角色:
- 超级管理员
- 管理员
- 版主
- 等等..
这行得通,如果我登录后我可以进入管理面板,并且只有在路由组中具有一个角色。
Route::middleware(['auth','role:SuperAdmin'])->group(function () {
Secret routes..
});
如果我尝试向路由组添加更多角色,这将不起作用 像这样:
Route::middleware(['auth','role:SuperAdmin|Admin|Moderator'])->group(function () {
注意'role:SuperAdmin|Admin|Moderator'
这是 RoleMiddleware 文件:
public function handle($request, Closure $next, $role, $permission = null)
{
if (!$request->user()->hasRole($role)) {
abort(404);
}
if ($permission !== null && !$request->user()->can($permission)) {
abort(404);
}
return $next($request);
}
User Class 有一个称为use:HasPermissionTrait 的特征
class User extends Authenticatable
{
use Notifiable, HasPermissionsTrait, Billable;
在 HasPermissionsTrait 中我有以下内容: 我的权限设置很好,只关注这个文件中的角色。我将角色逻辑移到了顶部。
use App\{Role, Permission};
trait HasPermissionsTrait
{
public function hasRole(...$roles)
{
foreach ($roles as $role) {
if ($this->roles->contains('name', $role)) {
return true;
}
}
return false;
}
public function roles()
{
return $this->belongsToMany(Role::class, 'users_roles');
}
... // Permission logic start here...
}
值得一提: 角色表是:
- 用户
- 角色
- users_roles(我知道正确的命名约定应该是
roles_users,但这里不相关)
只需要知道如何让它在路由组中工作:
'role:SuperAdmin|Admin|Moderator'
解决方案: 角色中间件文件:
public function handle($request, Closure $next, $role, $permission = null)
{
$role = strtolower( $request->user()->hasRole($role));
$allowed_roles = array_slice(func_get_args(), 2);
if (!$request->user()->hasRole(in_array($role, $allowed_roles))) {
abort(404);
}
if ($permission !== null && !$request->user()->can($permission)) {
abort(404);
}
return $next($request);
}
可以像这样做路由组。
Route::middleware(['auth','role:SuperAdmin|Admin'])->group(function () {
【问题讨论】:
标签: php laravel routes middleware laravel-middleware