摘要:中的中有一個組件叫,組件提供了整個框架的認(rèn)證功能,這里想簡單追蹤一下它的實現(xiàn)邏輯。
Laravel中的Auth
laravel中有一個組件叫auth,auth組件提供了整個框架的認(rèn)證功能,這里想簡單追蹤一下它的實現(xiàn)邏輯。
</>復(fù)制代碼
# IlluminateAuthConsoleAuthMakeCommand.php
public function handle()
{
// 創(chuàng)建存放auth前端界面的目錄和文件
// 模版存放在AuthConsole的stubs下
$this->createDirectories();
$this->exportViews();
if (! $this->option("views")) {
// 生成HomeController控制器文件
file_put_contents(
app_path("Http/Controllers/HomeController.php"),
$this->compileControllerStub()
);
// 生成auth相關(guān)路由
file_put_contents(
base_path("routes/web.php"),
file_get_contents(__DIR__."/stubs/make/routes.stub"),
FILE_APPEND
);
}
}
生成文件resources/views/auth、?resources/layouts路由文件 web.php 、和 Http/Controllers/Auth 下的控制器
說一說csrf-token</>復(fù)制代碼
</>復(fù)制代碼
function csrf_token()
{
$session = app("session");
if (isset($session)) {
return $session->token();
}
throw new RuntimeException("Application session store not set.");
}
LoginController的login方法
</>復(fù)制代碼
public function login(Request $request)
{
// 檢查請求體
$this->validateLogin($request);
// 判斷是否請求失敗太多次
if ($this->hasTooManyLoginAttempts($request)) {
$this->fireLockoutEvent($request);
return $this->sendLockoutResponse($request);
}
// 判斷是否驗證通過
if ($this->attemptLogin($request)) {
return $this->sendLoginResponse($request);
}
// 記錄請求失敗次數(shù)
$this->incrementLoginAttempts($request);
return $this->sendFailedLoginResponse($request);
}
登錄驗證方法attemptLogin
通過?Auth::guard() 引導(dǎo)到 IlluminateAuthAuthManager
先看? 服務(wù)提供者??AuthServiceProvider
AuthServiceProvider注冊四個服務(wù)
</>復(fù)制代碼
protected function registerAuthenticator()
{
$this->app->singleton("auth", function ($app) {
$app["auth.loaded"] = true;
// 生成一個AuthManager實例
return new AuthManager($app);
});
$this->app->singleton("auth.driver", function ($app) {
return $app["auth"]->guard();
});
}
</>復(fù)制代碼
protected function registerUserResolver()
{
$this->app->bind(
AuthenticatableContract::class, function ($app) {
return call_user_func($app["auth"]->userResolver());
}
);
}
</>復(fù)制代碼
protected function registerAccessGate()
{
$this->app->singleton(GateContract::class, function ($app) {
return new Gate($app, function () use ($app) {
return call_user_func($app["auth"]->userResolver());
});
});
}
</>復(fù)制代碼
protected function registerRequestRebindHandler()
{
$this->app->rebinding("request", function ($app, $request) {
$request->setUserResolver(function ($guard = null) use ($app) {
return call_user_func($app["auth"]->userResolver(), $guard);
});
});
}
生成一個AuthManager實例
AuthManager中的trait?CreatesUserProviders
這個trait是用來綁定一個用戶認(rèn)證的Eloqument服務(wù)提供者
</>復(fù)制代碼
public function __construct($app)
{
// 綁定application實例
$this->app = $app;
// 綁定一個閉包,用于解析用戶。
// 通過$guard來確定用戶解析用戶的方法
$this->userResolver = function ($guard = null) {
return $this->guard($guard)->user();
};
}
protected function resolve($name)
{
$config = $this->getConfig($name);
// 根據(jù)配置調(diào)用不同的解析用戶的驅(qū)動方法
$driverMethod = "create".ucfirst($config["driver"])."Driver";
if (method_exists($this, $driverMethod)) {
return $this->{$driverMethod}($name, $config);
}
}
分別定位的兩個方法
</>復(fù)制代碼
public function createSessionDriver($name, $config)
{
// 根據(jù)配置文件創(chuàng)建一個相應(yīng)的provider
$provider = $this->createUserProvider($config["provider"] ?? null);
$guard = new SessionGuard($name, $provider, $this->app["session.store"]);
return $guard;
}
public function createTokenDriver($name, $config)
{
$guard = new TokenGuard(
$this->createUserProvider($config["provider"] ?? null),
$this->app["request"],
$config["input_key"] ?? "api_token",
$config["storage_key"] ?? "api_token"
);
return $guard;
}
于是得到?$this->guard($guard)?的user()方法
先看如何實例一個TokenGuard類
</>復(fù)制代碼
public function __construct(UserProvider $provider, Request $request, $inputKey = "api_token", $storageKey = "api_token")
{
$this->request = $request;
$this->provider = $provider;
$this->inputKey = $inputKey;
$this->storageKey = $storageKey;
}
</>復(fù)制代碼
# IlluminateAuthTokenGuard
public function user()
{
if (! is_null($this->user)) {
return $this->user;
}
$user = null;
// 從request中獲取token
$token = $this->getTokenForRequest();
if (! empty($token)) {
// 通過用戶provider中的retrieveByCredentials方法來判斷用戶是否認(rèn)證成功
$user = $this->provider->retrieveByCredentials(
[$this->storageKey => $token]
);
}
return $this->user = $user;
}
上面都是通用的加載引導(dǎo)調(diào)用功能,下面的用戶服務(wù)提供者則是可以修改自定義的認(rèn)證的具體功能
認(rèn)證綁定的用戶數(shù)據(jù)提供者</>復(fù)制代碼
# IlluminateAuthDatabaseUserProvider
public function retrieveByCredentials(array $credentials)
{
if (empty($credentials) ||
(count($credentials) === 1 &&
array_key_exists("password", $credentials))) {
return;
}
$query = $this->conn->table($this->table);
foreach ($credentials as $key => $value) {
if (Str::contains($key, "password")) {
continue;
}
if (is_array($value) || $value instanceof Arrayable) {
$query->whereIn($key, $value);
} else {
$query->where($key, $value);
}
}
$user = $query->first();
// 返回auth用戶數(shù)據(jù)包
return $this->getGenericUser($user);
}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/31681.html
摘要:本文基于,主要介紹如何針對多站點分別進(jìn)行用戶認(rèn)證的改造,用意是最大限度利用自帶的認(rèn)證系統(tǒng)。具體方案為清晰起見,項目按照不同站點組織成不同模塊。學(xué)院版用戶認(rèn)證文檔版用戶認(rèn)證文檔更詳細(xì)學(xué)院版驗證文檔版驗證文檔更詳細(xì)翁航版多用戶認(rèn)證方案 原文發(fā)表于 http://www.jianshu.com/p/d6c112f27661 showImg(https://segmentfault.com/i...
摘要:因為客戶希望能夠直觀的看到目前購物車中商品信息,以便推送優(yōu)惠信息來促使轉(zhuǎn)化。用戶在商城中的購物車數(shù)據(jù)導(dǎo)購使用導(dǎo)購小程序代用戶下單或結(jié)賬時加入的購物車數(shù)據(jù),不和用戶購物車數(shù)據(jù)同步。 iBrand 產(chǎn)品中關(guān)于購物車的需求比較復(fù)雜,我們基于 overture/laravel-shopping-cart 擴展出了更加符合電商需求的購物車包,之前有文章進(jìn)行過簡單的介紹: Laravel shop...
摘要:新增了很多的新特性,包括了內(nèi)置多用戶認(rèn)證表單數(shù)組輸入驗證隱式路由模型綁定中間件組的定義中間件訪問頻率限制等主要功能。相對于變化有點大,簡化了的目錄結(jié)構(gòu),并將路由分離出來。由于已將的路由單獨分離出來,因此只需在中添加路由規(guī)則。 Laravel 5.2 新增了很多的新特性,包括了內(nèi)置多用戶認(rèn)證、表單數(shù)組輸入驗證、隱式路由模型綁定、中間件組的定義、中間件 throttle 訪問頻率限制等主要...
摘要:如何做用戶認(rèn)證根據(jù)文檔描述,提供用戶認(rèn)證的接口,他的核心是看守器和提供器,看守器定義怎么認(rèn)證用戶,提供器定義怎么檢索用戶。 最近的一個PHP項目,上一個項目是采用ThinkPHP來弄的,因為很早就聽說過Laravel的大名,所以進(jìn)了Laravel的官網(wǎng),意外發(fā)現(xiàn)了Lumen,正好我項目是提供API的,所以選擇了Lumen,因為是Laravel的精簡版,看了幾天的Laravel文檔,也總...
摘要:本文來源于本人博客認(rèn)證解析以及改用加密驗證的默認(rèn)登陸傳入郵件和用戶密碼到方法來認(rèn)證,通過的值獲取,如果用戶被找到,經(jīng)哈希運算后存儲在數(shù)據(jù)中的將會和傳遞過來的經(jīng)哈希運算處理的值進(jìn)行比較。 本文來源于本人博客: Laravel 5.2 Auth 認(rèn)證解析以及改用 salt+passwrod 加密驗證 Larval 5.2的默認(rèn)Auth登陸傳入郵件和用戶密碼到attempt 方法來認(rèn)證,通過...
閱讀 850·2021-11-16 11:56
閱讀 1670·2021-11-16 11:45
閱讀 3118·2021-10-08 10:13
閱讀 4108·2021-09-22 15:27
閱讀 732·2019-08-30 11:03
閱讀 650·2019-08-30 10:56
閱讀 953·2019-08-29 15:18
閱讀 1746·2019-08-29 14:05