我正在尝试在Laravel的web
文件中向路由组添加多个角色。
我想根据用户角色(例如admin部分)来保护某些路由。
某些路由需要多个角色进行访问。
角色示例:
这有效,登录后我可以进入管理面板,并且仅在路由组中具有 一个角色 。
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...
}
值得一提: 角色表为:
roles_users
,但此处不相关)只需要知道如何使它在路由组中工作:
'role:SuperAdmin|Admin|Moderator'
解决方案: RoleMiddleware文件:
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 () {
答案 0 :(得分:1)
这就是我在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() {
});
这可能不是完美的解决方案,至少对我有用。
答案 1 :(得分:0)
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);
}
答案 2 :(得分:0)
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
})
});
尝试这种方式来定义路由的路由组。我已经使用了这种语法,并且可以正常工作。
在父中间件组中定义auth,在子中间件组中定义角色。