摘要:返回表示用戶的對(duì)象。相反,存儲(chǔ)使用單向加密算法生成的哈希。例刪除當(dāng)前會(huì)話要從當(dāng)前身份驗(yàn)證會(huì)話中刪除所有數(shù)據(jù)包括當(dāng)前存儲(chǔ)的經(jīng)過(guò)身份驗(yàn)證的用戶,請(qǐng)使用靜態(tài)方法用戶操作有兩種操作可用于對(duì)經(jīng)過(guò)身份驗(yàn)證的用戶執(zhí)行角色驗(yàn)證和權(quán)限驗(yàn)證。檢查密碼重置請(qǐng)求。
Luthier CI 認(rèn)證框架 ( Authentication Framework ) 內(nèi)容 Contents
介紹 Introduction
創(chuàng)建用戶提供商 Creation of User Providers
用戶實(shí)例 User instance
用戶加載 Users load
密碼哈希及其驗(yàn)證 Password hash and its verification
驗(yàn)證用戶是否處于活動(dòng)狀態(tài)并已驗(yàn)證 Validate that a user is active and verified
與用戶提供商合作 Working with User Providers
用戶登錄 User login
高級(jí)用戶登錄 Advanced user login
會(huì)話 Sessions
在會(huì)話中存儲(chǔ)用戶 Storing a user in the session
從會(huì)話中檢索用戶 Retrieving a user from the session
自定義會(huì)話數(shù)據(jù) Custom session data
刪除當(dāng)前會(huì)話 Deleting the current session
用戶操作 User Operations
角色驗(yàn)證 Roles verification
權(quán)限驗(yàn)證 Permissions verification
基于控制器的認(rèn)證 Controller-based authentication
一般配置 General configuration
身份驗(yàn)證控制器 The authentication controller
登錄表單 The login form
登出 Log out
認(rèn)證事件 Authentication events
介紹 IntroductionLuthier CI Authentication Framework 是哪個(gè)用戶認(rèn)證系統(tǒng)是建立在笨的結(jié)構(gòu)。它提供了兩個(gè)主要困境的答案:從中獲取用戶以及在應(yīng)用程序中如何使用這些困境。
在此過(guò)程中使用用戶提供程序。用戶提供程序是一個(gè)類,負(fù)責(zé)從某個(gè)地方獲取經(jīng)過(guò)身份驗(yàn)證的用戶,作為CodeIgniter之間的中介,例如,數(shù)據(jù)庫(kù),API或甚至加載到內(nèi)存中的用戶數(shù)組。
本文針對(duì)高級(jí)用戶并具有非常特定的身份驗(yàn)證需求。如果您正在尋找預(yù)先配置且易于使用的解決方案,請(qǐng)參閱SimpleAuth的文檔,事實(shí)上,這是您將在下面閱讀的所有內(nèi)容的實(shí)現(xiàn)。
創(chuàng)建用戶提供商 Creation of User Providers所有用戶提供商都存儲(chǔ)在該application/security/providers文件夾中。此外,您的類必須實(shí)現(xiàn)LuthierAuthUserProviderInterface接口,該接口定義以下方法:
public function getUserClass(); public function loadUserByUsername($username, $password = null); public function hashPassword($password); public function verifyPassword($password, $hash); public function checkUserIsActive(UserInterface $user); public function checkUserIsVerified(UserInterface $user);
讓我們首先創(chuàng)建一個(gè)名為的文件MyUserProvider.php,它將成為我們的第一個(gè)用戶提供者:
用戶實(shí)例 User instance該用戶實(shí)例是通過(guò)認(rèn)證的用戶的邏輯表示:它們包含(和返回)所有的細(xì)節(jié),角色和權(quán)限。我們必須在User Provider中實(shí)現(xiàn)的第一個(gè)方法是getUserClass()返回從現(xiàn)在開始使用的用戶實(shí)例的名稱。
我們將調(diào)用我們的用戶實(shí)例MyUser,然后:
下一步是創(chuàng)建類MyUser。用戶實(shí)例文件保存在application/security/providers文件夾中。為了讓Luthier CI使用它們,類的名稱和文件名必須與getUserClass()方法中返回的名稱相匹配。
用戶實(shí)例必須實(shí)現(xiàn)LuthierAuthUserInterface接口,該接口定義以下方法:
public function __construct($instance, $roles, $permissions); public function getEntity(); public function getUsername(); public function getRoles(); public function getPermissions();實(shí)現(xiàn)所有這些方法,我們的MyUser類看起來(lái)像這樣:
user = $entity; $this->roles = $roles; $this->permissions = $permissions; } public function getEntity() { return $this->user; } public function getUsername() { return $this->user->email; } public function getRoles() { return $this->roles; } public function getPermissions() { return $this->permissions; } }我們的文件結(jié)構(gòu)如下:
application |- security | |- providers | | - MyUserProvider.php | | - MyUser.php用戶加載 Users load必須從某個(gè)地方獲取用戶,并且要實(shí)現(xiàn)以下方法,才能實(shí)現(xiàn)loadUserByUsername()該功能。
用戶加載只有兩種可能的結(jié)果:
Successful load: 找到匹配的用戶名和密碼。User Provider返回表示用戶的對(duì)象。
Failed load: 未找到用戶。以下任何異常拋出:UserNotFoundException,InactiveUserException,UnverifiedUserException或PermissionNotFoundException。
最簡(jiǎn)單的示例是在同一個(gè)User Provider中聲明一個(gè)數(shù)組,其中包含可用的用戶:
$users = [ [ "name" => "John Doe", "email" => "john@doe.com", "password" => "foo123", "active" => 1, "verified" => 1, ], [ "name" => "Alice Brown", "email" => "alice@brown.com", "password" => "bar456", "active" => 1, "verified" => 1, ] ];話雖如此,我們將使用以下代碼更新代碼:
"John Doe", "email" => "john@doe.com", "password" => "foo123", "active" => 1, "verified" => 1, ], [ "name" => "Alice Brown", "email" => "alice@brown.com", "password" => "bar456", "active" => 1, "verified" => 1, ] ]; $userEmails = array_column($users, "email"); $foundedIndex = array_search($username, $userEmails); if($foundedIndex === false) { throw new UserNotFoundException("Invalid user credentials!"); } $user = (object) $users[$foundedIndex]; if($user->password != $password) { throw new UserNotFoundException("Invalid user credentials!"); } $userClass = $this->getUserClass(); return new $userClass( /* User data */ $user, /* Roles */ ["user"], /* Permissions */ [] ); } }現(xiàn)在,我們的用戶提供程序能夠搜索數(shù)組并在匹配時(shí)返回用戶對(duì)象,或者如果找不到用戶則拋出UserNotFoundException異常。但是,作為一般規(guī)則,密碼通常不會(huì)(也不應(yīng)該)直接存儲(chǔ)。
相反,存儲(chǔ)使用單向加密算法生成的哈希。考慮這個(gè)新用戶數(shù)組:
$users = [ [ "name" => "John Doe", "email" => "john@doe.com", "password" => "$2y$10$c1iqXvXuFKZ4hI4l.LhCvuacba1fR3OX.uPfPD29j4DkyayC6p4uu", "active" => 1, "verified" => 1, ], [ "name" => "Alice Brown", "email" => "alice@brown.com", "password" => "$2y$10$xNHf.J7fbNdph2dy26JAdeQEA70aL/SG9ojrkpR3ocf1qph0Bafay", "active" => 1, "verified" => 1, ] ];每一個(gè)的密碼仍然完全相同,不同的是現(xiàn)在存儲(chǔ)的是你的哈希而不是純文本的密碼,
所以比較$user-> password == $password 是不夠的。
密碼哈希及其驗(yàn)證要實(shí)現(xiàn)的以下方法負(fù)責(zé)在用戶提供程序中生成和驗(yàn)證密碼哈希:
hashPassword(): [string] 以純文本形式接收密碼并返回其哈希值
verifyPassword(): [bool] ]以純文本和密碼哈希方式接收密碼,驗(yàn)證它們是否匹配
邏輯和實(shí)現(xiàn)由開發(fā)人員自行決定。在我們的例子中,我們將使用blowfish算法,留下如下代碼:
"John Doe", "email" => "john@doe.com", "password" => "$2y$10$c1iqXvXuFKZ4hI4l.LhCvuacba1fR3OX.uPfPD29j4DkyayC6p4uu", "active" => 1, "verified" => 1, ], [ "name" => "Alice Brown", "email" => "alice@brown.com", "password" => "$2y$10$xNHf.J7fbNdph2dy26JAdeQEA70aL/SG9ojrkpR3ocf1qph0Bafay", "active" => 1, "verified" => 1, ] ]; $userEmails = array_column($users, "email"); $foundedIndex = array_search($username, $userEmails); if($foundedIndex === false) { throw new UserNotFoundException("Invalid user credentials!"); } $user = (object) $users[$foundedIndex]; if(!$this->verifyPassword($password, $user->password)) { throw new UserNotFoundException("Invalid user credentials!"); } $userClass = $this->getUserClass(); return new $userClass( /* User data */ $user, /* Roles */ ["user"], /* Permissions */ [] ); } public function hashPassword($password) { return password_hash($password, PASSWORD_DEFAULT); } public function verifyPassword($password, $hash) { return password_verify($password, $hash); } }您可能已經(jīng)注意到$password該loadUserByUsername()方法的參數(shù)必須定義為可選參數(shù)。這是因?yàn)樵诿總€(gè)請(qǐng)求開始時(shí),Luthier CI會(huì)嘗試使用其用戶Provider重新加載最后一個(gè)經(jīng)過(guò)身份驗(yàn)證的用戶,這只有在可以從會(huì)話中相對(duì)安全的數(shù)據(jù)存儲(chǔ)中獲取用戶時(shí)才有可能,例如ID或用戶名。
因此,我們必須稍微修改我們的代碼,以確保即使沒(méi)有提供密碼,用戶提供商仍然能夠獲得用戶:
"John Doe", "email" => "john@doe.com", "password" => "$2y$10$c1iqXvXuFKZ4hI4l.LhCvuacba1fR3OX.uPfPD29j4DkyayC6p4uu", "active" => 1, "verified" => 1, ], [ "name" => "Alice Brown", "email" => "alice@brown.com", "password" => "$2y$10$xNHf.J7fbNdph2dy26JAdeQEA70aL/SG9ojrkpR3ocf1qph0Bafay", "active" => 1, "verified" => 1, ] ]; $userEmails = array_column($users, "email"); $foundedIndex = array_search($username, $userEmails); if($foundedIndex === false) { throw new UserNotFoundException("Invalid user credentials!"); } $user = (object) $users[$foundedIndex]; if($password !== NULL) { if(!$this->verifyPassword($password, $user->password)) { throw new UserNotFoundException("Invalid user credentials!"); } } $userClass = $this->getUserClass(); return new $userClass( /* User data */ $user, /* Roles */ ["user"], /* Permissions */ [] ); } public function hashPassword($password) { return password_hash($password, PASSWORD_DEFAULT); } public function verifyPassword($password, $hash) { return password_verify($password, $hash); } }不要使用md5()或sha1()函數(shù)進(jìn)行密碼哈希
這些算法非常有效,任何人(使用現(xiàn)代計(jì)算機(jī)和足夠的空閑時(shí)間)都可以嘗試通過(guò)暴力破解加密。有一節(jié)介紹了PHP文檔中的password hashes ,對(duì)于那些擔(dān)心安全性這一重要方面的人來(lái)說(shuō),毫無(wú)疑問(wèn)是必讀的。
驗(yàn)證用戶是否處于活動(dòng)狀態(tài)并已驗(yàn)證這一切仍然是執(zhí)行方法checkUserIsActive()和checkUserIsVerified(),正如它們的名字,驗(yàn)證用戶是主動(dòng)和他們的信息被驗(yàn)證。
您可以選擇激活和驗(yàn)證用戶的條件。在我們的例子中,對(duì)于要激活的用戶,其值active必須等于1,并且要驗(yàn)證它的值verified必須等于1。
通過(guò)實(shí)現(xiàn)這兩種方法,我們的用戶提供程序現(xiàn)在如下所示:
"John Doe", "email" => "john@doe.com", "password" => "$2y$10$c1iqXvXuFKZ4hI4l.LhCvuacba1fR3OX.uPfPD29j4DkyayC6p4uu", "active" => 1, "verified" => 1, ], [ "name" => "Alice Brown", "email" => "alice@brown.com", "password" => "$2y$10$xNHf.J7fbNdph2dy26JAdeQEA70aL/SG9ojrkpR3ocf1qph0Bafay", "active" => 1, "verified" => 1, ] ]; $userEmails = array_column($users, "email"); $foundedIndex = array_search($username, $userEmails); if($foundedIndex === false) { throw new UserNotFoundException("Invalid user credentials!"); } $user = (object) $users[$foundedIndex]; if($password !== NULL) { if(!$this->verifyPassword($password, $user->password)) { throw new UserNotFoundException("Invalid user credentials!"); } } $userClass = $this->getUserClass(); return new $userClass( /* User data */ $user, /* Roles */ ["user"], /* Permissions */ [] ); } public function hashPassword($password) { return password_hash($password, PASSWORD_DEFAULT); } public function verifyPassword($password, $hash) { return password_verify($password, $hash); } final public function checkUserIsActive(UserInterface $user) { /* * The getEntity() method is used to return an array / object / entity with the ?????????* user data. In our case, it is an object, so we can use ?????????* the following chained syntax: */ if($user->getEntity()->active == 0) { throw new InactiveUserException(); } } final public function checkUserIsVerified(UserInterface $user) { /* * The same here: */ if($user->getEntity()->verified == 0) { throw new UnverifiedUserException(); } } }完成!您已經(jīng)創(chuàng)建了第一個(gè)用戶提供程序和附加的用戶實(shí)例。您已準(zhǔn)備好對(duì)用戶進(jìn)行身份驗(yàn)證。
與用戶提供商合作在使用用戶提供程序之前,您應(yīng)該做的第一件事是將其上傳到您的應(yīng)用程序。為此,請(qǐng)使用類的靜態(tài)loadUserProvider()方法Auth。
例如,要加載以前的User Provider,語(yǔ)法如下:
$myUserProvider = Auth::loadUserProvider("MyUserProvider");用戶登錄要執(zhí)行登錄,請(qǐng)使用loadUserByUsername()User Provider 的方法,其中第一個(gè)參數(shù)是用戶名/電子郵件,第二個(gè)參數(shù)是您的密碼:
// We load a User Provider: $myUserProvider = Auth::loadUserProvider("MyUserProvider"); // Returns the user object corresponding to "john@doe.com": $john = $myUserProvider->loadUserByUsername("john@doe.com", "foo123"); // Returns the corresponding user object to "alice@brown.com": $alice = $myUserProvider->loadUserByUsername("alice@brown.com", "bar456");用戶提供程序的設(shè)計(jì)使得只能使用用戶名/電子郵件登錄:
$alice = $myUserProvider->loadUserByUsername("alice@brown.com");登錄期間的任何錯(cuò)誤都會(huì)產(chǎn)生異常,應(yīng)根據(jù)具體情況捕獲并處理:
// ERROR: The password of john@doe.com is incorrect! // (An exception "UserNotFoundException" will be thrown) $jhon = $myUserProvider->loadUserByUsername("john@doe.com", "wrong123"); // ERROR: The user anderson@example.com doesn"t exist! // (An exception "UserNotFoundException" will be thrown) $anderson = $myUserProvider->loadUserByUsername("anderson@example.com", "test123");高級(jí)用戶登錄該用戶提供返回用戶,但這并不意味著他們真的有權(quán)登錄。checkUserIsActive()和checkUserIsVerified()方法添加方便額外的檢查。
考慮以下用戶數(shù)組:
$users = [ [ "name" => "Alex Rodriguez", "email" => "alex@rodriguez.com", "password" => "$2y$10$2nXHy1LyNL217hfyINGKy.Ef5uhxa1FdmlMDw.nbGOkSEJtT6IJWy", "active" => 0, "verified" => 1, ], [ "name" => "Alice Brown", "email" => "alice@brown.com", "password" => "$2y$10$xNHf.J7fbNdph2dy26JAdeQEA70aL/SG9ojrkpR3ocf1qph0Bafay", "active" => 1, "verified" => 0, ], [ "name" => "Jessica Hudson", "email" => "jessica@example.com", "password" => "$2y$10$IpNrG1VG53DrborE4Tl6LevtVgVfoO9.Ef9TBVgH9I10DLRnML9gi", "active" => 1, "verified" => 1, ], ];以下登錄代碼:
use LuthierAuthExceptionUserNotFoundException; use LuthierAuthExceptionInactiveUserException; use LuthierAuthExceptionUnverifiedUserException; function advanced_login($username) { $myUserProvider = Auth::loadUserProvider("MyUserProvider"); try { $user = $myUserProvider->loadUserByUsername($username); $myUserProvider->checkUserIsActive($user); $myUserProvider->checkUserIsVerified($user); } catch(UserNotFoundException $e) { return "ERROR: User not found!"; } catch(InactiveUserException $e) { return "ERROR: Inactive user!"; } catch(UnverifiedUserException $e) { return "ERROR: Unverified user!"; } return "OK: Login success!"; } var_dump( advanced_login("alex@rodriguez.com") ); // ERROR: Inactive user! var_dump( advanced_login("alice@brown.com") ); // ERROR: Unverified user! var_dump( advanced_login("jack@grimes.com") ); // ERROR: User not found! var_dump( advanced_login("jessica@example.com") ); // OK: Login success!雖然alex@rodriguez.com并且alice@brown.com存在于用戶陣列內(nèi),但是根據(jù)用戶提供者,第一個(gè)是非活動(dòng)的而第二個(gè)未被驗(yàn)證,并且由于用戶jack@grimes .com不存在,唯一可以登錄的用戶是jessica@example.com。
所以,你不必定義advanced_login在應(yīng)用程序中一次又一次的功能,已經(jīng)有兩個(gè)方法,做同樣的事情:Auth::attempt()和Auth::bypass(),第一個(gè)用于通過(guò)用戶名和密碼,第二通過(guò)用戶名登錄登錄只。
除了處理異常外,以下表達(dá)式與前面的代碼等效:
Auth::bypass("alex@rodriguez.com", "MyUserProvider"); Auth::bypass("alice@brown.com", "MyUserProvider"); Auth::attempt("alex@rodriguez.com", "foo123", "MyUserProvider"); Auth::attempt("alice@brown.com", "bar456", "MyUserProvider");會(huì)話 Sessions如果經(jīng)過(guò)身份驗(yàn)證的用戶不能繼續(xù)瀏覽,那么能夠登錄的用途是什么?所述Auth類包括用于存儲(chǔ)和會(huì)話中獲得的用戶的功能。
在會(huì)話中存儲(chǔ)用戶 Storing a user in the session要在會(huì)話中存儲(chǔ)用戶,請(qǐng)使用靜態(tài)方法store():
$alice = $myUserProvider->loadUserByUsername("alice@brown.com"); Auth::store($alice);只要您不刪除會(huì)話或它過(guò)期,這將在導(dǎo)航的其余部分保存經(jīng)過(guò)身份驗(yàn)證的用戶。
從會(huì)話中檢索用戶要獲取存儲(chǔ)在會(huì)話中的用戶,請(qǐng)使用靜態(tài)方法user():
$alice = Auth::user();此方法返回用戶實(shí)例的對(duì)象,或者NULL如果沒(méi)有用戶存儲(chǔ)。
例:
$alice = Auth::user(); // The user entity // (The returned value depends on the User Provider, although the most common is that it is an object) $alice->getEntity(); // An array with the roles that the User Provider has assigned to the user $alice->getRoles(); // An array with the permissions that the User Provider has assigned to the user $alice->getPermissions();您可以使用靜態(tài)方法檢查用戶是匿名的(或邀請(qǐng)的)isGuest():
if( Auth::isGuest() ) { echo "Hi Guest!"; } else { echo "Welcome " . Auth::user()->getEntity()->name . "!"; }自定義會(huì)話數(shù)據(jù) Custom session data要在一個(gè)位置獲取并存儲(chǔ)您自己的會(huì)話數(shù)據(jù)(與身份驗(yàn)證相關(guān)),請(qǐng)使用靜態(tài)方法session(),其第一個(gè)參數(shù)是要存儲(chǔ)的值的名稱,第二個(gè)參數(shù)是指定的值。
例:
// Store a value Auth::session("my_value", "foo"); // Get a value $myValue = Auth::session("my_value"); var_dump( $myValue ); // foo // Get ALL stored values var_dump( Auth::session() ); // [ "my_value" => "foo" ]刪除當(dāng)前會(huì)話 Deleting the current session要從當(dāng)前身份驗(yàn)證會(huì)話中刪除所有數(shù)據(jù)(包括當(dāng)前存儲(chǔ)的經(jīng)過(guò)身份驗(yàn)證的用戶),請(qǐng)使用靜態(tài)方法destroy:
Auth::destroy();用戶操作 Users operations有兩種操作可用于對(duì)經(jīng)過(guò)身份驗(yàn)證的用戶執(zhí)行:角色驗(yàn)證和權(quán)限驗(yàn)證。
角色驗(yàn)證 Roles verification要驗(yàn)證用戶是否具有某個(gè)角色,請(qǐng)使用static方法isRole(),其第一個(gè)參數(shù)是要驗(yàn)證的角色的名稱:
Auth::isRole("user");You can supply a different user object to the one stored in session as a second argument:
$alice = Auth::loadUserProvider("MyUserProvider")->bypass("alice@brown.com"); Auth::isRole("admin", $user);權(quán)限驗(yàn)證 Permissions verification要驗(yàn)證用戶是否具有特定權(quán)限,請(qǐng)使用static方法isGranted(),其第一個(gè)參數(shù)是要驗(yàn)證的權(quán)限的名稱:
Auth::isGranted("general.read");您可以將另一個(gè)用戶對(duì)象提供給存儲(chǔ)在會(huì)話中的用戶對(duì)象作為第二個(gè)參數(shù):
$alice = Auth::loadUserProvider("MyUserProvider")->bypass("alice@brown.com"); Auth::isGranted("general.read", $user);基于控制器的認(rèn)證 Controller-based authentication到目前為止,您已經(jīng)看到Luthier CI身份驗(yàn)證框架的元素多帶帶工作。好消息是你可以讓它們一起工作!這一切都?xì)w功于我們稱之為基于控制器的身份驗(yàn)證的方法。
基于控制器的身份驗(yàn)證包括兩個(gè)接口的實(shí)現(xiàn),一個(gè)在控制器中,另一個(gè)在中間件中,您可以選擇自動(dòng)化用戶身份驗(yàn)證過(guò)程。
一般配置 General configuration您可以創(chuàng)建(盡管不是必需的)在應(yīng)用程序文件夾auth.php內(nèi)調(diào)用的config文件,以配置基于驅(qū)動(dòng)程序的身份驗(yàn)證的選項(xiàng)。SimpleAuth文檔中解釋了每個(gè)選項(xiàng)的含義
這是配置文件的示例:
如果該文件不存在,將使用默認(rèn)配置,如上所述。
身份驗(yàn)證控制器 The authentication controller身份驗(yàn)證驅(qū)動(dòng)程序是實(shí)現(xiàn)該LuthierAuthControllerInterface接口的任何CodeIgniter控制器,它定義了以下方法:
public function getUserProvider(); public function getMiddleware(); public function login(); public function logout(); public function signup(); public function emailVerification($token); public function passwordReset(); public function passwordResetForm($token);讓我們首先創(chuàng)建一個(gè)名為的控制器 AuthController.php, 它實(shí)現(xiàn)了所有必需的方法:
load->view("auth/login.php"); } public function logout() { return; } public function signup() { $this->load->view("auth/signup.php"); } public function emailVerification($token) { $this->load->view("auth/email_verification.php"); } public function passwordReset() { $this->load->view("auth/password_reset.php"); } public function passwordResetForm($token) { $this->load->view("auth/password_reset_form.php"); } }getUserProvider()和getMiddleware()方法返回的值對(duì)應(yīng)于用戶提供程序和中間件,其中包含將在后續(xù)過(guò)程中使用的身份驗(yàn)證事件。對(duì)于User Provider,它將與前面的示例相同,MyUserProvider:
public function getUserProvider() { return "MyUserProvider"; }對(duì)于具有身份驗(yàn)證事件的中間件,將使用一個(gè)調(diào)用MyAuthMiddleware(尚不存在),我們將在稍后討論:
public function `getMiddleware() { return "MyAuthMiddleware"; }該login()和logout()方法定義會(huì)話的開始和結(jié)束。當(dāng)用戶登錄時(shí),Luthier CI會(huì)自動(dòng)截獲并處理請(qǐng)求,因此在我們的控制器中,我們只需要使用登錄表單顯示一個(gè)視圖:
public function login() { $this->load->view("auth/login.php"); }注銷也將由Luthier CI處理,因此我們的logout()方法在控制器級(jí)別絕對(duì)沒(méi)有任何作用:
public function logout() { return; }其余方法的實(shí)現(xiàn)取決于您,但我們會(huì)讓您了解它們的功能應(yīng)該是什么:
signup(): 具有用戶注冊(cè)表的所有邏輯的方法。在這里,您必須顯示注冊(cè)表單并對(duì)其進(jìn)行處理(將用戶保存在數(shù)據(jù)庫(kù)中等)
emailVerification( string $token ): 負(fù)責(zé)驗(yàn)證新注冊(cè)用戶的電子郵件。通常,您已收到一封電子郵件,其中包含帶有驗(yàn)證令牌($token)的鏈接。
passwordReset(): 顯示密碼重置的表單。
passwordResetForm( string $token ): 檢查密碼重置請(qǐng)求。幾乎總是它是一封發(fā)送給用戶的電子郵件,其中包含一個(gè)帶有密碼重置令牌的鏈接($token)
登錄表單 The login form我們的login()方法是指一個(gè)叫做的視圖auth/login.php。讓我們創(chuàng)建它:
Log in Log in
然后,我們必須在我們的web.php文件中添加以下路徑:
Route::match(["get", "post"], "login", "AuthController@login")->name("login");
訪問(wèn)url時(shí)/login,必須顯示我們創(chuàng)建的登錄表單:
您可以獲得具有在身份驗(yàn)證過(guò)程中發(fā)生的錯(cuò)誤的安排,并在您的視圖中使用它來(lái)通知用戶。使用該Auth::messages()方法,如下所示:
Log in Log in
"Incorrect email or password", "ERR_LOGIN_INACTIVE_USER" => "Inactive user", "ERR_LOGIN_UNVERIFIED_USER" => "Unverified user", ]; ?> $message){ ?>= $errorMessages[$message] ;?>
您的登錄表已準(zhǔn)備就緒!
您可以隨意嘗試用戶提供商中提供的任意用戶名/密碼組合。登錄時(shí),您將被重定向到您在選項(xiàng)中定義的路徑$config ["auth_login_route_redirect"],或者如果沒(méi)有這樣的路徑,則重定向到應(yīng)用程序的根URL。
注銷 Log out現(xiàn)在我們將配置注銷。唯一需要的是定義將要使用的路由,默認(rèn)情況下它將是您調(diào)用的路由logout:
Route::get("logout", "AuthController@logout")->name("logout");
我們的路線文件最終將類似于:
Route::match(["get", "post"], "login", "AuthController@login")->name("login"); Route::get("logout", "AuthController@logout")->name("logout");認(rèn)證事件 Authentication events
你還記得getMiddleware()控制器的方法嗎?返回特殊中間件的名稱:具有身份驗(yàn)證事件的中間件。
我們將創(chuàng)建一個(gè)名為MyAuthMiddleware擴(kuò)展抽象類的中間件LuthierAuthMiddleware,通過(guò)實(shí)現(xiàn)所有必需的方法,它將如下所示:
每種方法都對(duì)應(yīng)一個(gè)身份驗(yàn)證事件,如下所述:
preLogin: 用戶訪問(wèn)登錄路徑時(shí)觸發(fā)的事件,無(wú)論是否登錄。
onLoginSuccess: 在成功登錄會(huì)話之后以及隨后的重定向之前立即觸發(fā)事件。
onLoginFailed: 在會(huì)話嘗試失敗后,以及隨后的重定向之前觸發(fā)的事件。
onLoginInactiveUser: 如果InactiveUserException在用戶提供程序中引發(fā)異常,則觸發(fā)事件,對(duì)應(yīng)于非活動(dòng)用戶登錄錯(cuò)誤。
onLoginUnverifiedUser: 如果UnverifiedUserException在User Provider內(nèi)拋出異常,則觸發(fā)事件,對(duì)應(yīng)于未驗(yàn)證用戶登錄時(shí)的錯(cuò)誤。
onLogout: 用戶關(guān)閉會(huì)話后立即觸發(fā)事件。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/31393.html
摘要:訪問(wèn)控制列表的配置與訪問(wèn)控制列表使用的類別和權(quán)限類別組的名稱和的關(guān)聯(lián)排列。 簡(jiǎn)單的認(rèn)證 SimpleAuth 內(nèi)容 Contents 介紹 Introduction 安裝 Installation 第1步:復(fù)制所需的文件 Step 1: Copy the required files 第2步:安裝數(shù)據(jù)庫(kù) Step 2: Install the database 第3步:定義...
摘要:認(rèn)證介紹包含構(gòu)建用戶身份驗(yàn)證系統(tǒng)所需的所有工具。不幸的是,它缺乏易于實(shí)現(xiàn),維護(hù)和擴(kuò)展的集成接口或庫(kù)。激活作為可選模塊,必須首先激活認(rèn)證功能。它專為最常見的身份驗(yàn)證設(shè)計(jì)通過(guò)表單和數(shù)據(jù)庫(kù)進(jìn)行傳統(tǒng)登錄。 認(rèn)證 Authentication 介紹 Introduction CodeIgniter包含構(gòu)建用戶身份驗(yàn)證系統(tǒng)所需的所有工具。不幸的是,它缺乏易于實(shí)現(xiàn),維護(hù)和擴(kuò)展的集成接口或庫(kù)。 Lut...
摘要:歡迎關(guān)于是的一個(gè)插件,增加了有趣的功能,旨在簡(jiǎn)化大型網(wǎng)站和的構(gòu)建。它是為了盡可能地與框架集成,因此在安裝后,應(yīng)用程序中已存在的所有內(nèi)容應(yīng)該繼續(xù)正常工作。在大多數(shù)情況下,安裝不會(huì)超過(guò)分鐘社區(qū)和支持要報(bào)告錯(cuò)誤并提出更改,請(qǐng)?jiān)L問(wèn)上的存儲(chǔ)庫(kù) 歡迎 關(guān)于Luthier CI Luthier CI是CodeIgniter的一個(gè)插件,增加了有趣的功能,旨在簡(jiǎn)化大型網(wǎng)站和API的構(gòu)建。 它是為了盡可能...
摘要:安裝內(nèi)容要求安裝獲得啟用自動(dòng)加載和掛鉤將與您的應(yīng)用程序連接初始化要求安裝獲得需要通過(guò)安裝。編寫權(quán)限如果在創(chuàng)建基本文件期間出現(xiàn)錯(cuò)誤,則可能是由于權(quán)限不足。確保該文件夾具有寫入權(quán)限 安裝 ( Installation ) 內(nèi)容 ( Contents ) 要求 Requirements 安裝 Installation 獲得Luthier CI Get Luthier CI 啟用Co...
摘要:寫入權(quán)限確保該文件夾具有寫入權(quán)限,以便這些命令正常工作僅適用于開發(fā)出于安全原因,如果您的應(yīng)用程序配置了或環(huán)境,則將禁用這些命令激活默認(rèn)情況下禁用工具。 命令行 Command line 內(nèi)容 Contents 介紹 Introduction 句法 Syntax 使用CLI路由 Using CLI routes 內(nèi)置CLI工具 Built-in CLI tools 激活 Ac...
閱讀 1295·2021-10-08 10:04
閱讀 1922·2021-09-04 16:40
閱讀 2536·2019-08-30 13:21
閱讀 2280·2019-08-29 15:10
閱讀 2848·2019-08-29 12:35
閱讀 1189·2019-08-26 17:41
閱讀 3062·2019-08-26 17:03
閱讀 1136·2019-08-26 12:01