下面由laravel教程欄目給大家介紹如何給laravel普通用戶提權(quán),希望對(duì)需要的朋友有所幫助!
引言
系統(tǒng)內(nèi)使用User表記錄用戶的屬性,各自維護(hù)用戶自身的關(guān)聯(lián)數(shù)據(jù)。 有一些前端頁面也會(huì)需要分別根據(jù)身份展示不同級(jí)別的內(nèi)容。
本期為大家說一說給普通用戶提權(quán)為管理員。
數(shù)據(jù)準(zhǔn)備
我們希望在users表內(nèi)指定用戶的身份,比如任命為管理員,則可以展示更多的數(shù)據(jù)資源。
我們?cè)趗sers表內(nèi)追加一個(gè)字段 is_admin 用于標(biāo)記用戶的管理員身份,使用命令創(chuàng)建遷移文件:
首先填充 up 方法用于遷移執(zhí)行的邏輯:
public function up(){ Schema::table('users', function(Blueprint $table) { $table->boolean('is_admin')->default(false); }); }
如果遷移失敗,進(jìn)行回滾使用的 down 方法:
public function down() { Schema::table('users', function(Blueprint $table) { $table->dropColumn('is_admin'); } }
完成編輯后保存,并執(zhí)行遷移指令:
php artisan migrate復(fù)制代碼
為了測(cè)試,我們使用mysql客戶端直接連接數(shù)據(jù)庫,并手動(dòng)指定一個(gè)管理員,使用下面的SQL語句:
update users set is_admin = true where email = 'admin@admin.com';
路由
為了區(qū)別于普通用戶的前端頁面,我們使用新的命名空間 Admin 放置管理員相關(guān)的代碼。首先創(chuàng)建控制器:
php artisan make:controller Admin/UsersController復(fù)制代碼
然后添加路由,編輯 routes/web.php 文件并添加以下內(nèi)容:
Route::group(['prefix' => 'admin', 'Namespace' => 'Admin'], function(){ Route::resource('user', 'UsersController'); });
注意我們使用了兩個(gè)關(guān)鍵的參數(shù),
- prefix : 也就是該組內(nèi)的所有路由地址,使用 prefix 最為前綴
- namespace : 命名空間,指定該組內(nèi)所有的控制器,均位于該命名空間下。
控制器
上一節(jié)的路由我們定義的是資源路由,使用restful風(fēng)格聲明。下面創(chuàng)建 app/http/Controllers/admin/UsersController.php 文件,并實(shí)現(xiàn) index 方法。代碼內(nèi)容如下:
public function index(){ $users = User::orderBy('created_at', 'desc')->get(); return view('admin.users.index')->withUsers($users); }
我們還需要一個(gè)視圖文件,承載上述的數(shù)據(jù)。創(chuàng)建目錄 resources/views/admin/users/index.blade.php,簡(jiǎn)單創(chuàng)建一個(gè)模板:
<h1>Registered Users</h1> <ul> @forelse ($users as $user) <li>{{ $user->name }} ({{ $user->email }})</li> @empty <li>No registered users</li> @endforelse </ul>
展示的是所有用戶的信息。這顯然必須擁有較高的權(quán)限。所以我們?cè)诮o數(shù)據(jù)之前,要識(shí)別用戶是否管理員:
if (Auth::user()->is_admin != true) { return redirect()->route('home')->withMessage('Access denied!'); }
如果不是就路由到首頁。這樣的判斷,如果頁面多了起來之后,每次都要在控制器內(nèi)敲寫,著實(shí)麻煩。所以,必須使用更靠前的驗(yàn)證,也就是 中間件!
中間件
中間件可以注冊(cè)給路由文件,在命中路由后,調(diào)用中間件進(jìn)行身份識(shí)別,這是不錯(cuò)的選擇。
使用命令行創(chuàng)建中間件文件:
php artisan make:middleware AdminAuthentication復(fù)制代碼
生成的文件位于 app/Http/Middleware/ 目錄下,編輯 AdminAuthentication 文件,并實(shí)現(xiàn)代碼邏輯:
namespace AppHttpMiddleware;use Closure;use IlluminateContractsAuthGuard;use IlluminateHttpRedirectResponse;class AdminAuthentication { public function handle($request, Closure $next) { if ($request->user()) { if ($request->user()->is_admin == true) { return $next($request); } } // 驗(yàn)證不通過 return new RedirectResponse(url('/')); } }
然后在 app/Http/Kernel.php 文件內(nèi)注冊(cè)該中間件,并命名:
protected $routeMiddleware = [ 'admin' => AppHttpMiddlewareAdminAuthentication::class, ];復(fù)制代碼
修改 路由 一節(jié)中聲明的路由組,引入中間件:
Route::group( [ 'prefix' => 'admin', 'namespace' => 'admin', 'middleware' => 'admin'], function(){ Route::resource('users', 'UsersController'); });
寫在最后
本文又是一個(gè)功能齊全卻又mini小巧的短文,詳細(xì)闡述了如何為users表添加管理員功能。
通過注冊(cè)路由到中間件的使用,又一次體驗(yàn)了laravel各個(gè)組件協(xié)同作用的能力!