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