簡體   English   中英

如何使用中間件根據用戶角色重定向?

[英]How to redirect according to user role using middleware?

我正在 Laravel 中做項目。 我想根據他的角色重定向用戶。

我的桌子是,

具有字段(id、名稱、密碼)的用戶表。

具有字段 (id,role) 的角色表。

assigned_role表具有字段(id、role_id、user_id)。

我有用戶模型,

用戶名

public function roles()
{
    return $this->belongsToMany('App\Role', 'assigned_roles', 'user_id', 'role_id');
}

為此,我創建了一個名為“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');

    });
});

但是當我在登錄過程中它重定向到正確的 url。 但是現在它可以在不檢查用戶是否登錄的情況下訪問內頁。 而當我對 RoleMiddleware 部分發表評論時,它會阻止訪問內部頁面,除非用戶進行日志記錄。

我不知道該怎么做。

如果我理解正確的話:

  • 您想限制沒有超級管理員角色的用戶(無論他們是否經過身份驗證),以防止他們訪問某個 URL。
  • 您還嘗試將沒有超級管理員角色的任何經過身份驗證的用戶重定向到 url /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

    });
});

在您的角色中間件中,您需要阻止沒有超級管理員角色的經過身份驗證的用戶訪問給定的 url,在這種情況下,只需將他們重定向到另一個 url

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM