簡體   English   中英

檢查用戶在Laravel中的角色

[英]Checking the user's role in Laravel

我是Laravel的初學者。 我在Laravel 5.8中有項目。

我有以下代碼:

中間人:

class CheckRole
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->hasRole([$role])) {
            if( $role == 'admin' || $role== 'receptionist' || $role == 'adminCompany' || $role == 'telemarketer')
            {
                return redirect('/cms');
            }
            else
            {
                return redirect()->route('index');
            }

        }

        return $next($request);
    }
}

播種機:

public function run()
    {
        DB::table('roles')->insert([
            'name' => 'admin'
        ]);
        DB::table('roles')->insert([
            'name' => 'adminCompany'
        ]);

        DB::table('roles')->insert([
            'name' => 'telemarketer'
        ]);

        DB::table('roles')->insert([
            'name' => 'receptionist'
        ]);

        DB::table('roles')->insert([
            'name' => 'user'
        ]);

        DB::table('roles')->insert([
            'name' => 'userPremium'
        ]);

        DB::table('roles')->insert([
            'name' => 'userCompany'
        ]);

        DB::table('roles')->insert([
            'name' => 'userSponsor'
        ]);

        DB::table('roles')->insert([
            'name' => 'userGuest'
        ]);

    }

架構:

Schema::create('roles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->engine = "InnoDB";
        });

和我的web.php:

Route::group(['prefix' => 'admin'], function () {
    Route::get('/', 'BackendController@index')->name('adminHome')->middleware('CheckRole:user,CheckRole:userPremium,CheckRole:userCompany,CheckRole:userSponsor,CheckRole:userGuest');
});

User.php

public function hasRole(array $roles)
    {

        foreach ($roles as $role) {

            if (isset(self::$roles[$role])) {
                if (self::$roles[$role]) return true;

            } else {
                self::$roles[$role] = $this->roles()->where('name', $role)->exists();
                if (self::$roles[$role]) return true;
            }

        }
        return false;
    }

我希望CheckRole中間件檢查用戶是否具有以下角色:adminadmin的用戶,userPremium,userCompany,userSponsor,userGuest。 目前,Laravel僅檢查1個角色-並非全部。

怎么修呢?

您應該使用來分隔中間件的參數,而不是重復請求相同的中間件

此處存在相同問題,請參見: 如何在Laravel 5.2中使用OR條件將多個參數傳遞給中間件

您可能會認為https://github.com/spatie/laravel-permission是權限包。

Route::group(['prefix' => 'admin'], function () {
    Route::get('/', 'BackendController@index')->name('adminHome')->middleware('CheckRole:user,userPremium,userCompany,userSponsor,UserGuest');
});

就像我上面發布的文章一樣,您需要處理中間件參數,

作為另一個答案的例子,像這樣

/**
 * Handle an incoming request.
 *
 * @param $request
 * @param Closure $next
 * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
 */
public function handle($request, Closure $next) {

    $roles = array_slice(func_get_args(), 2); // [default, admin, manager]

    foreach ($roles as $role) {

        try {

            Role::whereName($role)->firstOrFail(); // make sure we got a "real" role

            if (Auth::user()->hasRole($role)) {
                return $next($request);
            }

        } catch (ModelNotFoundException $exception) {

            dd('Could not find role ' . $role);

        }
    }

    Flash::warning('Access Denied', 'You are not authorized to view that content.'); // custom flash class

    return redirect('/');
}

您可能可以像數組一樣訪問laravel 5.8中的$ role,或者應該檢查它是數組還是字符串,然后循環遍歷它們

看起來更干凈一點,然后使用func_get_args()

暫無
暫無

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

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