国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Laravel中的Auth

張漢慶 / 3615人閱讀

摘要:中的中有一個組件叫,組件提供了整個框架的認(rèn)證功能,這里想簡單追蹤一下它的實現(xiàn)邏輯。

Laravel中的Auth

laravel中有一個組件叫auth,auth組件提供了整個框架的認(rèn)證功能,這里想簡單追蹤一下它的實現(xiàn)邏輯。

首先從 php artisan make:auth?開始
# 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

        function csrf_token()
    {
        $session = app("session");

        if (isset($session)) {
            return $session->token();
        }

        throw new RuntimeException("Application session store not set.");
    }

LoginController的login方法
    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ù)

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();
        });
    }
protected function registerUserResolver()
    {
        $this->app->bind(
            AuthenticatableContract::class, function ($app) {
                return call_user_func($app["auth"]->userResolver());
            }
        );
    }
protected function registerAccessGate()
    {
        $this->app->singleton(GateContract::class, function ($app) {
            return new Gate($app, function () use ($app) {
                return call_user_func($app["auth"]->userResolver());
            });
        });
    }
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ù)提供者

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);
        }
    }

分別定位的兩個方法

        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類

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;
    }
# 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ù)提供者
# 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://m.specialneedsforspecialkids.com/yun/31681.html

相關(guān)文章

  • Laravel 多用戶認(rèn)證系統(tǒng)改造方案

    摘要:本文基于,主要介紹如何針對多站點分別進(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...

    paulli3 評論0 收藏0
  • Laravel 獲取當(dāng)前 Guard 分析 —源自電商購物車的實際需求

    摘要:因為客戶希望能夠直觀的看到目前購物車中商品信息,以便推送優(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...

    daydream 評論0 收藏0
  • API Token Authentication

    摘要:新增了很多的新特性,包括了內(nèi)置多用戶認(rèn)證表單數(shù)組輸入驗證隱式路由模型綁定中間件組的定義中間件訪問頻率限制等主要功能。相對于變化有點大,簡化了的目錄結(jié)構(gòu),并將路由分離出來。由于已將的路由單獨分離出來,因此只需在中添加路由規(guī)則。 Laravel 5.2 新增了很多的新特性,包括了內(nèi)置多用戶認(rèn)證、表單數(shù)組輸入驗證、隱式路由模型綁定、中間件組的定義、中間件 throttle 訪問頻率限制等主要...

    KitorinZero 評論0 收藏0
  • Lumen用戶認(rèn)證JWT,源碼解讀

    摘要:如何做用戶認(rèn)證根據(jù)文檔描述,提供用戶認(rèn)證的接口,他的核心是看守器和提供器,看守器定義怎么認(rèn)證用戶,提供器定義怎么檢索用戶。 最近的一個PHP項目,上一個項目是采用ThinkPHP來弄的,因為很早就聽說過Laravel的大名,所以進(jìn)了Laravel的官網(wǎng),意外發(fā)現(xiàn)了Lumen,正好我項目是提供API的,所以選擇了Lumen,因為是Laravel的精簡版,看了幾天的Laravel文檔,也總...

    AZmake 評論0 收藏0
  • Laravel 5.2 Auth 認(rèn)證解析以及改用 salt+passwrod 加密驗證

    摘要:本文來源于本人博客認(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)證,通過...

    binaryTree 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<