如何使用中间件根据用户角色重定向?

时间:2016-05-12 12:43:30

标签: php laravel laravel-5.2

我在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部分发表评论时,它会阻止访问内部页面,除非用户进行日志记录。

我不知道该怎么做。

1 个答案:

答案 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');        
}