總結
Auth中間件用於定義未登陸用戶只能操做哪些權限
policy受權策略定義了當前用戶實例與進行受權的用戶是否匹配,一致才能進一步操做,不然返回403禁止訪問異常
場景:用戶登陸
Auth步驟php
找到須要過濾動做的控制器,以中間件形式寫入該類的構造方法中(或可在路由定義,在group by語句前)
except:未登陸用戶只能操做數組中的動做,其餘均須要登陸用戶方可操做
only:未登陸用戶只能操做數組中的動做,其餘均須要驗證,常與guest搭配。例只容許guest未登陸用戶訪問註冊頁,至關於已登陸用戶沒法訪問註冊頁。
友好轉向:用戶訪問中間件動做中權限受阻時,會自動跳轉到設定頁面。可在RedirectIfAuthenticated.php設定redirect()跳轉的頁面
場景:用戶只能編輯本身
Policy步驟數組
artisan生成 xxxxPolicy 策略文件
lara約定了 Policy字眼前的前綴名字爲關聯模型的命名,並自動引入該模型類命名空間。例如生成 UserPolicy策略, 類中會自動引入User模型類的命名空間
在app/policies中定義策略方法
定義方法,形參依賴注入 當前登陸模型實例和進行受權用戶實例的兩個參數 例如 (User $$currentUser, User $user)
方法體寫入斷定條件 如 當前登陸模型實例與受權用戶實例的ID比較
在Providers/Auth/serviceProvider.php的$policies屬性中定義受權策略與模型關聯 ,
\App\Models\User::class => \App\Policies\UserPolicy::class,
在控制器中調用$this->authorize('update',$user)
第一 個參數對應的是受權類方法中定義的方法名。
第二個參數$user對應的是update受權方法的第二個參數(進行受權的用戶實例)
簡介
Laravel內置了一箇中間件來驗證用戶的身份認證。若是用戶沒有經過身份認證,中間件會重定向到登陸頁面。但若是經過認證,則容許該請求更進一步進入。session
能夠將中間件想象爲一系列HTTP請求必須通過才能觸發應用的層。每一層都會檢查請求(是否符合某些條件),若是不符合,甚至能夠在請求訪問以前徹底拒絕。app
1.必須先登陸
在用戶控制器中使用構造方法。框架
$this->middleware('auth',[
'except'=>['show','create','store']
]);
middleware方法接收兩個參數:ide
第一個:中間件名稱
第二個:要進行過濾的動做
其中該中間件還有兩個動做this
except設定指定動做,數組中的動做將不使用Auth中間件的過濾方法。至關於除了數組中指定動做之外,全部其餘的動做都必須登陸用戶才能訪問
only白名單,只容許訪問數組中的動做
2.用戶只能編輯本身的資料
當用戶1嘗試更新用戶2的資料時,應彈出403 forbidden禁止訪問異常。
在lara中可使用policy對用戶操做權限進行驗證,未經受權進行的操做將會返回403spa
2.1新建一個受權策略類
$ php artisan make:polcy UserPolicy
新建的策略類將會安置在app/Policiies文件夾下。此處體現了【約定優於配置】 中間件
下面建立一個策略類ci
public function update(User $currentUser,User $user){
return $currentUser->id===$user->id;
}
update方法接收兩個參數,第一個參數默認爲當前登陸用戶實例,第二參數則爲要進行受權的用戶實例。當兩個id相同時,則表明兩個用戶是相同用戶。若不一樣則拋除403異常信息拒絕訪問。
使用受權時須要注意兩個地方
並不須要檢查$currentUser(當前登陸用戶實例)是否爲null。框架會自動爲其全部權限返回false
調用時,默認狀況下,不須要傳遞當前登陸用戶到該方法內。框架會自動加載當前登陸用戶。
2.2受權關聯
在AuthServiceProvider類中對受權策略進行設置。該文件包含一個policies屬性,用於將各類模型對應到管理它們的受權策略上(至關於關聯)。此處須要爲模型指定UserPolicy
接下來,在protected 的policies屬性中添加
\App\Models\User::class=>\App\Policies\UserPolicy::class
受權完畢後,可在控制器中使用authorize方法驗證用戶受權策略。默認的App\Http\Controllers\Controller類包含AuthorizesRequeststrait。該trait提供authorize方法,能夠被用於快速受權指定行爲。當無權限運行該行爲時,會拋出HttpException。
authorize方法接收兩個參數
第一個:受權策略名稱(UserPolicy中的受權的update方法)
第二個:進行受權驗證的數據(用戶模型實例,即數據表中指定的字段)
//此處的update對應 UserPolicy的update受權方法
//$user對應的是update受權方法的第二參數。
$this->authorize('update',$user)
調用policy中的update方法時,默認狀況下不須要傳遞第一個參數。當前登陸用戶($currentUser)登陸時,框架會自動加載當前登陸用戶
在如下兩處地方分別添加上受權策略驗證
edit:當前登陸用戶嘗試編輯時,調用策略類中的update,判斷當前登陸用戶的id是否與模型實例中進行受權的id相同,若不是則無權訪問
update同上
2.3友好轉向
未登陸用戶嘗試編輯資料,將會跳轉到登陸頁面,若是用戶再進行登陸,則會重定向到我的中心頁面上。
更好的體驗,應該是將用戶重定向到他以前嘗試訪問的頁面。
redirect()實例提供了一個intended方法(嘗試之意,用戶嘗試訪問的域名).可將頁面重定向到上一次請求嘗試訪問的頁面上,並接收一個默認跳轉地址參數,當上一次請求記錄爲空時,跳轉到默認地址上。
常見場景,可在會話管理(登陸管理)中添加intended方法,
2.4註冊於登陸頁面訪問限制
只讓未登陸用戶訪問登陸頁面和註冊頁面
sessionController:登陸管理相關,只容許訪客登陸create(登陸界面),至關設置已登陸的用戶沒法訪問登陸頁權限(此時會跳轉到默認頁,需調整)
UsersController:用戶管理相關,只容許訪客登陸create(註冊界面),
登陸控制器/用戶控制器:
$this->middleware('guest',[
//guest指未登陸用戶,訪客
//only:可理解爲白名單,指定一些只容許未登陸用戶訪問的動做
'only'=>['create']
]);
2.5訪問權限受阻返回頁面
訪問Auth定義的中間件權限受阻時,會被跳轉到默認/home頁面。此處須要修改中間件中的redirect()方法並加上友好提醒
文件:app/Http/Middleware/RedirectIfAuthenticated.php,此處的Auth關聯Users控制器(中間件引入了該類)
session()->flash('info', '您已登陸,無需再次操做。');return redirect('/'); //默認重定向的頁面