我在laravel做项目。我想根据他的角色重定向用户。
我的桌子是,
用户表,包含字段(id,name,password)。
带有字段(id,role)的角色表。
带有字段(id,role_id,user_id)的assigned_role 表。
我有用户模型,
user.php的
public function roles()
{
return $this->belongsToMany('App\Role', 'assigned_roles', 'user_id', 'role_id');
}
为此,我创建了一个名为“RoleMiddleware”的中间件
RoleMiddleware:
public function handle($request, Closure $next)
{
$roles = $request->user()->roles;
foreach ($roles as $role) {
if($role->name != 'super-admin')
return redirect('/user');
}
return $next($request);
}
我在kernel.php文件中有这个中间件,
Kernel.php 看起来像,
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'role' => \App\Http\Middleware\RoleMiddleware::class,
];
但现在我不知道如何使用这个中间件。当我在 Route.php 文件中添加此中间件时,
Route::group(['middleware' => 'web'], function () {
Route::auth();
Route::group(['middleware' => 'role'], function () {
Route::get('/home', 'HomeController@index');
Route::get('/user', 'UserController@index');
});
});
但是当我登录进程时,它会重定向到正确的网址。但现在它可以访问内部页面而无需检查用户是否已登录。然而,当我对RoleMiddleware部分发表评论时,它会阻止访问内部页面,除非用户进行日志记录。
我不知道该怎么做。
答案 0 :(得分:1)
如果我理解正确的话:
/user
。正确?
以下是如何做到这一点:
在routes.php文件中,您需要为超级管理员用户和经过身份验证的用户提供路由(没有超级管理员角色)
Route::group(['middleware' => 'web'], function () {
Route::auth();
Route::group(['middleware' => ['auth', 'role']], function () {
// All routes you put here can only be accessible to users with super-admin role
});
Route::group(['middleware' => 'auth'], function () {
// All routes you put here can be accessible to all authenticated users
});
});
在您的角色中间件中,您需要阻止没有superadmin角色的经过身份验证的用户访问给定的网址,在这种情况下只需将其重定向到另一个网址
public function handle($request, Closure $next)
{
$roles = $request->user()->roles;
foreach ($roles as $role) {
if($role->name == 'super-admin')
// If user is super-admin, accept the request
return $next($request);
}
// If user does not have the super-admin role redirect them to another page that isn't restricted
return redirect('/user');
}