如何将多个角色添加到路由组 laravel
How to add multiple roles to a route group laravel
我正在尝试向 Laravel 中我的 web
文件中的路由组添加多个角色。
我想根据用户角色保护某些路由,例如管理部分。
一些路由需要多个角色才能访问。
示例角色:
- 超级管理员
- 管理员
- 版主
- 等..
这行得通,如果登录我可以转到管理面板,并且仅在路由组中有 一个角色。
Route::middleware(['auth','role:SuperAdmin'])->group(function () {
Secret routes..
});
This does not work if I try and add more roles to to the route group
like this: 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
,但这里不相关)
Just need to know how to get this working in the route group:
'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 () {
explode
中间件中的角色并检查可用角色
public function handle($request, Closure $next, $role, $permission = null)
{
$roles = is_array($role)
? $role
: explode('|', $role);
if (!$request->user()->hasRole($roles)) {
abort(404);
}
if ($permission !== null && !$request->user()->can($permission)) {
abort(404);
}
return $next($request);
}
Route::middleware(['auth'])->group(function () {
//Routes available to super admin
Route::middleware(['role:SuperAdmin'])->group(function () {
//write route hear
});
//Routes available to SuperAdmin, Admin and Moderator
Route::middleware(['role:SuperAdmin|Admin|Moderator'])->group(function () {
//write route hear
})
});
尝试这种方式来定义路由的路由组。我已经使用了这种语法并且它有效。
在父中间件组中定义身份验证,在子中间件组中定义角色。
这就是我在 CheckRole Middleware
中所做的
public function handle($request, Closure $next) {
// I'm using the api guard
$role = strtolower( request()->user()->type );
$allowed_roles = array_slice(func_get_args(), 2);
if( in_array($role, $allowed_roles) ) {
return $next($request);
}
throw new AuthenticationException();
}
在我的路由器文件中
Route::group(["middleware" => "role:admin,worker"], function() {
});
这可能不是完美的解决方案,至少对我有用。
我正在尝试向 Laravel 中我的 web
文件中的路由组添加多个角色。
我想根据用户角色保护某些路由,例如管理部分。
一些路由需要多个角色才能访问。
示例角色:
- 超级管理员
- 管理员
- 版主
- 等..
这行得通,如果登录我可以转到管理面板,并且仅在路由组中有 一个角色。
Route::middleware(['auth','role:SuperAdmin'])->group(function () {
Secret routes..
});
This does not work if I try and add more roles to to the route group like this:
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
,但这里不相关)
Just need to know how to get this working in the route group:
'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 () {
explode
中间件中的角色并检查可用角色
public function handle($request, Closure $next, $role, $permission = null)
{
$roles = is_array($role)
? $role
: explode('|', $role);
if (!$request->user()->hasRole($roles)) {
abort(404);
}
if ($permission !== null && !$request->user()->can($permission)) {
abort(404);
}
return $next($request);
}
Route::middleware(['auth'])->group(function () {
//Routes available to super admin
Route::middleware(['role:SuperAdmin'])->group(function () {
//write route hear
});
//Routes available to SuperAdmin, Admin and Moderator
Route::middleware(['role:SuperAdmin|Admin|Moderator'])->group(function () {
//write route hear
})
});
尝试这种方式来定义路由的路由组。我已经使用了这种语法并且它有效。
在父中间件组中定义身份验证,在子中间件组中定义角色。
这就是我在 CheckRole Middleware
public function handle($request, Closure $next) {
// I'm using the api guard
$role = strtolower( request()->user()->type );
$allowed_roles = array_slice(func_get_args(), 2);
if( in_array($role, $allowed_roles) ) {
return $next($request);
}
throw new AuthenticationException();
}
在我的路由器文件中
Route::group(["middleware" => "role:admin,worker"], function() {
});
这可能不是完美的解决方案,至少对我有用。