摘要:而日志中間件則可以記錄所有傳入應(yīng)用程序的請求。框架已經(jīng)內(nèi)置了一些中間件,包括維護(hù)身份驗(yàn)證保護(hù),等等。所有的中間件都放在目錄內(nèi)。在中可以使用授權(quán)策略來對用戶的操作權(quán)限進(jìn)行驗(yàn)證,在用戶未經(jīng)授權(quán)進(jìn)行操作時(shí)將返回異常。
一、HTTP 中間件這一節(jié)我們將給相關(guān)的動(dòng)作頁面添加權(quán)限,如已經(jīng)登錄的用戶將不會(huì)看到注冊、登錄按鈕,更不會(huì)對別人的個(gè)人資料進(jìn)行編輯操作,除非是管理員,這里我們將借助Laravel提供的中間件Middleware快速實(shí)現(xiàn)。
HTTP 中間件提供了一個(gè)方便的機(jī)制來過濾進(jìn)入應(yīng)用程序的 HTTP 請求,例如,Laravel 本身使用中間件來驗(yàn)證用戶的身份,如果用戶未通過身份驗(yàn)證,中間件將會(huì)把用戶導(dǎo)向登錄頁面,反之,當(dāng)用戶通過了身份驗(yàn)證,中間件將會(huì)通過此請求并接著往下執(zhí)行。
當(dāng)然,除了身份驗(yàn)證之外,中間件也可以被用來運(yùn)行各式各樣的任務(wù),CORS 中間件負(fù)責(zé)替所有即將離開程序的響應(yīng)加入適當(dāng)?shù)臉?biāo)頭。而日志中間件則可以記錄所有傳入應(yīng)用程序的請求。
Laravel 框架已經(jīng)內(nèi)置了一些中間件,包括維護(hù)、身份驗(yàn)證、CSRF 保護(hù),等等。所有的中間件都放在app/Http/Middleware?目錄內(nèi)。
若是希望每個(gè) HTTP 請求都經(jīng)過一個(gè)中間件,只要將中間件的類加入到?app/Http/Kernel.php?的?$middleware?屬性清單列表中。
// 在 AppHttpKernel 類內(nèi)... protected $routeMiddleware = [ "auth" => AppHttpMiddlewareAuthenticate::class, "auth.basic" => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class, "guest" => AppHttpMiddlewareRedirectIfAuthenticated::class,];
Laravel 提供的 Auth 中間件在過濾指定動(dòng)作時(shí),如果該用戶未通過身份驗(yàn)證,默認(rèn)將會(huì)被重定向到 auth/login 登錄頁面,但我們在應(yīng)用中使用的登錄頁面地址是 /login,因此我們需要對 Auth 中間件默認(rèn)的重定向地址進(jìn)行更改。
app/Http/Middleware/Authenticate.php
auth->guest()) { if ($request->ajax()) { return response("Unauthorized.", 401); } else { return redirect()->guest("login"); } } return $next($request); } }
通過閱讀 Auth 中間件的源碼可知,Auth 中間件會(huì)先判斷當(dāng)前用戶是否為游客(未登錄狀態(tài)的用戶),當(dāng)用戶為游客且請求方式是 ajax 時(shí),則拋出一個(gè) 401 響應(yīng)信息,如果不是通過 ajax 的方式請求,則重定向到登錄頁面。最后,如果用戶為已登錄狀態(tài),則接著執(zhí)行下一個(gè)請求。
現(xiàn)在退出登錄,再次嘗試訪問 http://sample.app/users/1/edit 頁面將會(huì)被重定向到登錄頁面。
二、授權(quán)策略 (Policy)在完成對用戶未登錄限制之后,我們來研究下已登錄用戶的權(quán)限驗(yàn)證,即只有用戶自己才能編輯自己的個(gè)人信息,其他用戶無權(quán)編輯。
在 Laravel 中可以使用 授權(quán)策略(Policy) 來對用戶的操作權(quán)限進(jìn)行驗(yàn)證,在用戶未經(jīng)授權(quán)進(jìn)行操作時(shí)將返回 403 異常。
我們可以使用以下命令來生成一個(gè)名為 UserPolicy 的授權(quán)策略類文件,用于管理用戶模型的授權(quán)。
$ php artisan make:policy UserPolicy
什么是授權(quán)策略呢?我們一般在個(gè)人資料編輯時(shí),需要驗(yàn)證是否為用戶自己,這樣才有權(quán)限修改,先查出用戶的個(gè)人信息,然后再和登錄的用戶ID判斷是否為同一個(gè)人,而Laravel為我們提供了一套授權(quán)機(jī)制,只需新建一個(gè)授權(quán)策略,然后將其直接調(diào)用:
$ php artisan make:policy UserPolicy
id === $user->id; } }
update 方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)默認(rèn)為當(dāng)前登錄用戶實(shí)例,第二個(gè)參數(shù)則為要進(jìn)行授權(quán)的用戶實(shí)例。當(dāng)兩個(gè) id 相同時(shí),則代表兩個(gè)用戶是相同用戶,用戶通過授權(quán),可以接著進(jìn)行下一個(gè)操作。如果 id 不相同的話,將拋出 403 異常信息來拒絕訪問。
使用授權(quán)策略需要注意以下兩點(diǎn):
我們并不需要檢查 $currentUser 是不是 NULL。未登錄用戶,框架會(huì)自動(dòng)為其 所有權(quán)限 返回 false;
調(diào)用時(shí),默認(rèn)情況下,我們 不需要 傳遞當(dāng)前登錄用戶至該方法內(nèi),因?yàn)榭蚣軙?huì)自動(dòng)加載當(dāng)前登錄用戶(接著看下去,后面有例子);
接下來我們還需要在 AuthServiceProvider 類中對授權(quán)策略進(jìn)行設(shè)置。AuthServiceProvider 包含了一個(gè) policies 屬性,該屬性用于將各種模型對應(yīng)到管理它們的授權(quán)策略上。我們需要為用戶模型 User 指定授權(quán)策略 UserPolicy。
app/Providers/AuthServiceProvider.php
"AppPoliciesModelPolicy", User::class => UserPolicy::class, ]; /** * Register any application authentication / authorization services. * * @param IlluminateContractsAuthAccessGate $gate * @return void */ public function boot(GateContract $gate) { $this->registerPolicies($gate); // } }
授權(quán)策略定義完成之后,我們便可以通過在用戶控制器中使用 authorize 方法來驗(yàn)證用戶授權(quán)策略。默認(rèn)的 AppHttpControllersController 類包含了 Laravel 的 AuthorizesRequests trait。此 trait 提供了 authorize 方法,它可以被用于快速授權(quán)一個(gè)指定的行為,當(dāng)無權(quán)限運(yùn)行該行為時(shí)會(huì)拋出 HttpException。authorize 方法接收兩個(gè)參數(shù),第一個(gè)為授權(quán)策略的名稱,第二個(gè)為進(jìn)行授權(quán)驗(yàn)證的數(shù)據(jù)。
我們需要為 edit 和 update 方法加上這行:
$this->authorize("update", $user);
書寫的位置如下:
app/Http/Controllers/UsersController.php
authorize("update", $user); return view("users.edit", compact("user")); } public function update($id, Request $request) { $this->validate($request, [ "name" => "required|max:50", "password" => "confirmed|min:6" ]); $user = User::findOrFail($id); // 授權(quán)策略判斷 $this->authorize("update", $user); $data = array_filter([ "name" => $request->name, "password" => $request->password, ]); $user->update($data); session()->flash("success", "個(gè)人資料更新成功!"); return redirect()->route("users.show", $id); } }
現(xiàn)在,如果你使用 id 為 1 的用戶去訪問 id 為 2 的用戶編輯頁面,將拋出 403 異常信息。
三、PHP中的Trait 特性及作用PHP中的Trait 特性及作用
Traits 是一種為類似 PHP 的單繼承語言而準(zhǔn)備的代碼復(fù)用機(jī)制。Trait 為了減少單繼承語言的限制,使開發(fā)人員能夠自由地在不同層次結(jié)構(gòu)內(nèi)獨(dú)立的類中復(fù)用方法集
簡單使用
首先,當(dāng)然是聲明個(gè) Trait,PHP5.4 增加了 trait 關(guān)鍵字
trait first_trait { function first_method() { /* Code Here */ } function second_method() { /* Code Here */ } }
同時(shí),如果要在 Class 中使用該 Trait,那么使用 use 關(guān)鍵字
class first_class { // 注意這行,聲明使用 first_trait use first_trait; } $obj = new first_class(); // Executing the method from trait $obj->first_method(); // valid $obj->second_method(); // valid1.使用多個(gè) Trait
trait first_trait { function first_method() { echo "method"; } } trait second_trait { function second_method() { echo "method"; } } class first_class { // now using more than one trait use first_trait, second_trait; } $obj= new first_class(); // Valid $obj->first_method(); // Print : method // Valid $obj->second_method(); // Print : method2. Trait 中聲明抽象方法
我們可以在 Trait 中聲明需要實(shí)現(xiàn)的抽象方法,這樣能使使用它的 Class 必須實(shí)現(xiàn)它
trait first_trait { function first_method() { echo "method"; } // 這里可以加入修飾符,說明調(diào)用類必須實(shí)現(xiàn)它 abstract public function second_method(); } class first_method { use first_trait; function second_method() { /* Code Here */ } }
Laravel中也應(yīng)用了許多Trait方法
Laravel中使用上邊定義好的Trait方法:
AppPoliciesUserPolicyid === $user->id; } }相關(guān)文章:
我所理解的 PHP Trait
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/22289.html
摘要:學(xué)習(xí)筆記之已經(jīng)聊過使用了來設(shè)計(jì),看源碼發(fā)現(xiàn)其巧妙用了和的一些數(shù)組函數(shù)來設(shè)計(jì)。開發(fā)環(huán)境內(nèi)置函數(shù)和看源碼之前,先看下這幾個(gè)內(nèi)置函數(shù)的使用。學(xué)習(xí)筆記之實(shí)例化源碼解析已經(jīng)聊過的實(shí)例化,得到中的變量,即的實(shí)例化對象。后面再學(xué)習(xí)下的源碼,到時(shí)見。 說明:本文主要學(xué)習(xí)Laravel的Middleware的源碼設(shè)計(jì)思想,并將學(xué)習(xí)心得分享出來,希望對別人有所幫助。Laravel學(xué)習(xí)筆記之Decorato...
摘要:本文主要學(xué)習(xí)總結(jié)下間參數(shù)傳遞。開發(fā)時(shí)經(jīng)常碰到類似場景有時(shí)需要在中讀取中設(shè)置的和,有時(shí)也需要在中讀取中設(shè)置的參數(shù)。總結(jié)下這幾個(gè)知識點(diǎn),便于查閱。 本文主要學(xué)習(xí)總結(jié)下Route,Middleware,Controller間參數(shù)傳遞。開發(fā)時(shí)經(jīng)常碰到類似場景:有時(shí)需要在Middleware中讀取Route中設(shè)置的middleware parameter和route parameter,有時(shí)也需...
摘要:在登錄后臺時(shí)也是必須認(rèn)證才行。使用這種總比粗暴的限制訪問來保護(hù)安全要高效的多,一切都是為了自動(dòng)化,為了提高生產(chǎn)率。總結(jié)本文主要學(xué)習(xí)使用這個(gè)神器來做,并學(xué)習(xí)了如何使用集成進(jìn)程序中。我司最近需要一名伙伴一起共同航海去,有興趣速來。 說明:本文主要研究利用Duo來實(shí)現(xiàn)雙重認(rèn)證,Two-Factor Authentication就是除了username-password這種登錄認(rèn)證之外,還使用...
摘要:然后中間件使用方法來啟動(dòng)獲取實(shí)例,使用類來管理主要分為兩步獲取實(shí)例,主要步驟是通過該實(shí)例從存儲(chǔ)介質(zhì)中讀取該次請求所需要的數(shù)據(jù),主要步驟是。 說明:本文主要通過學(xué)習(xí)Laravel的session源碼學(xué)習(xí)Laravel是如何設(shè)計(jì)session的,將自己的學(xué)習(xí)心得分享出來,希望對別人有所幫助。Laravel在web middleware中定義了session中間件IlluminateSess...
摘要:本文來自原文鏈接歡迎作客我們的學(xué)習(xí)群這個(gè)例子將引導(dǎo)你在中使用來創(chuàng)建用戶登錄和注冊的。是的簡稱,可以幫助我們創(chuàng)建用戶認(rèn)證,以此連接前后端。 本文來自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學(xué)習(xí)群:109256050 這個(gè)例子將引導(dǎo)你在laravel中使用JWT來創(chuàng)建用戶登錄和注冊的API。JWT是Json Web Token的簡稱,可以幫助我們創(chuàng)建...
閱讀 3187·2021-11-23 09:51
閱讀 1524·2021-11-22 09:34
閱讀 2836·2021-10-27 14:15
閱讀 2266·2021-10-12 10:17
閱讀 1884·2021-10-12 10:12
閱讀 946·2021-09-27 14:00
閱讀 1996·2021-09-22 15:19
閱讀 1032·2019-08-30 10:51