簡體   English   中英

使用中間件Laravel使用角色權限保護路由

[英]Protecting Routes with Role Permissions using middleware Laravel

我有一個多級成員網站,需要在Laravel 5.5的web.php文件中保護我的路線。

我的用戶表上有一列稱為role_id

role_id為以下值

  • NULL(對於新用戶)
  • 1(所有者)
  • 2(對於管理員)
  • 3(主持人)
  • 4(對於禁止用戶)

我試圖用一個簡單的IF語句來做到這一點

if (Auth::user()->role_id != '2'):
    return view('home');
    else:
//ADMIN ROUTES
    Route::get('/admin','AdminController@index')->name('admin');
endif;

if (Auth::user()->role_id != '1'):
    return view('home');
    else:
//OWNER ROUTES
    Route::get('/admin','OwnerController@index')->name('owner');
endif;
ETC....

但是獲取錯誤試圖獲取非對象的屬性。 也可能不是最好的方法。

因此,我讀到了有關使用MIDDLEWARE這樣做的信息:(看起來好多了)

Route::group(['middleware' => ['auth', 'admin']], function() {
    // put all your admin routes here
});

Route::group(['middleware' => ['auth', 'owner']], function() {
    // put all your owner user routes here
});

但這並未說明如何添加中間件。 我是否需要為每個組創建5個不同的中間件文件,類似於我找到的文件:

use Illuminate\Contracts\Auth\Guard;

class Admin
{
    protected $auth;

    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }

    public function handle($request, Closure $next)
    {
        if($this->auth->user()->role_id != '2') {
            return redirect()->view('home');
        }
        return $next($request);        
    }
}

有人可以伸出援手,解釋如何編寫正確的中間件來實現這一目標嗎?

嘗試獲取非對象的屬性時出錯。 如果用戶尚未登錄,則可以找到。

在您檢查之前

if (Auth::user()->role_id != '2'):

您應確保用戶使用

Auth::check()

第一...

像這個例子:

 Route::get('/cart/payment', 'CartController@getcartpayment')->middleware('checkAuth');


 $user = Sentinel::findById($user_id);
        $role= $user->role();

web.php

Route::group(['middleware' => ['auth', 'admin']], function() {
    Route::get('/admin/dashboard', function(){
        return view('admin.dashboard');
    });
});

進入Kernel.php的受保護的$ routeMiddleware

'admin'      => \App\Http\Middleware\AdminMiddleware::class,

AdminMiddleware.php

$user = Auth::user();
if($user->role == 'admin'){
    return $next($request);
} else
    // abort(403, 'Wrong Accept Header');
    return new Response(view('notauthorized')->with('role', 'admin'));

}

admin,版主,所有者,banned_user將是user表的user_type / role列的值。 或者您可以使用user_type_idrole_id代替user_type_namerole_type

不要忘記添加

use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Response;

就在

use Closure; 

您的中間件

您也可以使用Gate之類的其他方式來做到這一點,如果需要,請告訴我。 :)

暫無
暫無

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

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