成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

paulli3 / 2540人閱讀

摘要:本文基于,主要介紹如何針對(duì)多站點(diǎn)分別進(jìn)行用戶認(rèn)證的改造,用意是最大限度利用自帶的認(rèn)證系統(tǒng)。具體方案為清晰起見(jiàn),項(xiàng)目按照不同站點(diǎn)組織成不同模塊。學(xué)院版用戶認(rèn)證文檔版用戶認(rèn)證文檔更詳細(xì)學(xué)院版驗(yàn)證文檔版驗(yàn)證文檔更詳細(xì)翁航版多用戶認(rèn)證方案

原文發(fā)表于 http://www.jianshu.com/p/d6c112f27661

背景

項(xiàng)目包含若干子站點(diǎn),不同站點(diǎn)功能各異,但共享底層數(shù)據(jù)及邏輯。為開(kāi)發(fā)及運(yùn)維效率期間,決定在一個(gè) Laravel 應(yīng)用內(nèi)實(shí)現(xiàn)整套系統(tǒng)。

本文基于 Laravel 5.2,主要介紹如何針對(duì)多站點(diǎn)分別進(jìn)行用戶認(rèn)證的改造,用意是最大限度利用 Laravel 自帶的認(rèn)證系統(tǒng)。不過(guò)默認(rèn)的認(rèn)證都是根據(jù) 『email』和『password』字段進(jìn)行的。之后有時(shí)間可能再追加自定義字段比如『phone』的改造方案,本文暫不涉及。

具體方案

為清晰起見(jiàn),項(xiàng)目按照不同站點(diǎn)組織成不同模塊。在 Laravel 原有目錄結(jié)構(gòu)基礎(chǔ)內(nèi),分別給各個(gè)站點(diǎn)創(chuàng)設(shè)目錄。

laravel 5.2 project
├── app
│   └── Http
│       └── Controllers
│           ├── Site1
│           └── Site2
└── resources
    └── views
        ├── site1
        └── site2

本文以 Admin 為例進(jìn)行說(shuō)明,如需增加其他站點(diǎn),進(jìn)行類似改動(dòng)即可。

Structure

執(zhí)行下列命令生成默認(rèn)路由、控制器及視圖。

php artisan make:auth

將默認(rèn)的控制器和視圖結(jié)構(gòu)分別復(fù)制到子模塊下,并創(chuàng)建相關(guān)模型、遷移表、修改路由、認(rèn)證配置。

本例中,分別在 app/Http/Controllers 及 resources/views 下新建 Admin 及 admin 目錄,所有該站點(diǎn)相關(guān)的 Controller 及 view 均放置在上述兩目錄下。

最終涉及到的文件樹(shù)如下。

laravel 5.2 project
├── app
│?? ├── Exceptions
│?? │?? └── Handler.php (變更)
│?? ├── Http
│?? │?? ├── Controllers
│?? │?? │?? └── Admin (新建)
│?? │?? │??  ?? ├── Auth
│?? │?? │??  ?? │?? ├── AuthController.php
│?? │?? │??  ?? │?? └── PasswordController.php
│?? │?? │??  ?? └── HomeController.php
│?? │?? └── routes.php (變更)
│?? └── Admin.php (新建)
├── config
│?? └── auth.php (變更)
├── database
│?? └── migrations
│??  ?? ├── 2014_10_12_000000_create_admins_table.php (新建)
│??  ?? └── 2014_10_12_100000_create_admin_password_resets_table.php (新建)
└── resources
 ?? └── views
 ??     └── admin (新建)
 ??      ?? ├── auth
 ??      ?? │   ├── emails
 ??      ?? │   │?? └── password.blade.php
 ??      ?? │   ├── login.blade.php
 ??      ?? │   ├── passwords
 ??      ?? │   │?? ├── email.blade.php
 ??      ?? │   │?? └── reset.blade.php
 ??      ?? │   └── register.blade.php
     ??     ├── errors
            │?? └── 503.blade.php
  ??        ├── home.blade.php
         ?? ├── layouts
 ??         │?? └── app.blade.php
     ??     └── welcome.blade.php
Config

針對(duì) Admin 新建 provider(下面的 admins),使用 Admin 的 Model。
針對(duì) Admin 新建 guard,使用新建的 provider——『admins』。

config/auth.php

"guards" => [
    "admins" => [
        "driver" => "session",
        "provider" => "admins",
    ],
],
"providers" => [
    "admins" => [
        "driver" => "eloquent",
        "model" => AppAdmin::class, // 使用自定義的 Model(Admin)
    ],
],

Admin 站點(diǎn)使用 Auth 門面時(shí)均需指定 guard 為 admins,例如獲得當(dāng)前登錄用戶:Auth::guard("admins")->user()。

Router

這里的作用當(dāng)然是讓訪問(wèn) Admin 站點(diǎn)的請(qǐng)求被轉(zhuǎn)入該站點(diǎn)的 Controller。
本例中,不同系統(tǒng)是以站點(diǎn)域名來(lái)區(qū)分的,當(dāng)然也可以用別的方法。

app/Http/routes.php

Route::group(["domain" => "admin.example.com", "namespace" => "Admin"], function () { // 之前將默認(rèn)認(rèn)證相關(guān)類保持結(jié)構(gòu)復(fù)制到了 Admin 下,此時(shí)只需簡(jiǎn)單指定公共命名空間即可
    Route::auth(); // 各種注冊(cè)、登錄、找回密碼的默認(rèn)路由
    Route::group(["middleware" => ["auth:admins"]], function () { // 指定 auth 的 guard 為 新建的 admins
        Route::get("/", "HomeController@index"); // 登錄成功才能訪問(wèn)的部分放在認(rèn)證保護(hù)內(nèi)
    });
});
View

我們需要針對(duì)不同的站點(diǎn)使用不同的樣式或者用戶認(rèn)證邏輯,所以將原 resources/views 下文件復(fù)制到 resources/views/admin 下,同時(shí)針對(duì)路徑變更修改代碼。

resources/views/vendor 由于框架中若干處硬編碼,所以沒(méi)法直接移走,用到相關(guān)的功能需另想辦法處理。

view() 方法
例如 view("auth、view("home、view("layouts、view("welcome,初始狀態(tài)下,這種形式的使用場(chǎng)所如下。

app/Http/Controllers/HomeController.php:27:        return view("home");
app/Http/routes.php:15:    return view("welcome");
vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/controllers/HomeController.stub:27:        return view("home");
vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php:37:        return view("auth.login");
vendor/laravel/framework/src/Illuminate/Foundation/Auth/RegistersUsers.php:33:        return view("auth.register");
vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords.php:49:            return view("auth.passwords.email");
vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords.php:52:        return view("auth.password");
vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords.php:194:            return view("auth.passwords.reset")->with(compact("token", "email"));
vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords.php:197:        return view("auth.reset")->with(compact("token", "email"));

app 目錄下的 view 直接加上 admin. 的前綴就好。
vendor 目錄下的都是通過(guò) trait 的形式被 AppHttpControllersAuthAuthController 使用的,而且都留好了自定義屬性可供改寫,例如下方先判斷若不存在 $this->loginView,才使用默認(rèn)的 auth.login。所以我們只需要繼承默認(rèn)的 AuthController 并指定這些相關(guān)屬性即可。(參見(jiàn) Controller 部分介紹)

vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php

public function showLoginForm()
{
    $view = property_exists($this, "loginView")
                ? $this->loginView : "auth.authenticate";

    if (view()->exists($view)) {
        return view($view);
    }

    return view("auth.login");
}

@include()@extends() 方法
同樣,還是針對(duì) auth、home、layouts、welcome 進(jìn)行處理,初始狀態(tài)下 Laravel 只使用到了 layouts.app 這個(gè)文件。

resources/views/auth/login.blade.php:1:@extends("layouts.app")
resources/views/auth/passwords/email.blade.php:1:@extends("layouts.app")
resources/views/auth/passwords/reset.blade.php:1:@extends("layouts.app")
resources/views/auth/register.blade.php:1:@extends("layouts.app")
resources/views/home.blade.php:1:@extends("layouts.app")
resources/views/welcome.blade.php:1:@extends("layouts.app")
vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/login.stub:1:@extends("layouts.app")
vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/passwords/email.stub:1:@extends("layouts.app")
vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/passwords/reset.stub:1:@extends("layouts.app")
vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/register.stub:1:@extends("layouts.app")
vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/home.stub:1:@extends("layouts.app")
vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/welcome.stub:1:@extends("layouts.app")

resources 目錄下的只需要簡(jiǎn)單加上前綴 admin. 即可。
vendor 目錄下的文件在運(yùn)行時(shí)沒(méi)有作用,所以不用處理。

Auth 門面
由于 Admin 站點(diǎn)新建了 guard,所以使用默認(rèn) Auth 門面的場(chǎng)合也需要更改。

resources/views/layouts/app.blade.php:56:                    @if (Auth::guest())
resources/views/layouts/app.blade.php:62:                                {{ Auth::user()->name }} 
vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/layouts/app.stub:56:                    @if (Auth::guest())
vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/layouts/app.stub:62:                                {{ Auth::user()->name }} 

resources 目錄下,用 Admin::guard("admins")-> 替換 Auth:: 來(lái)指定 guard。
vendor 目錄下的文件在運(yùn)行時(shí)沒(méi)有作用,所以不用處理。

Migration & Model

畢竟是新增的站點(diǎn),參考自帶的 users/password_resets 新建相關(guān)的 table 及 model 即可。

Controller

將原 app/Http/Controllers 下相關(guān)結(jié)構(gòu)復(fù)制到 Admin 下后,修改 namespace,然后針對(duì) Admin 相關(guān)進(jìn)行變動(dòng)。

此處以 AuthController 為例,PasswordController 類似:

app/Http/Controllers/Admin/Auth/AuthController.php

use AppHttpControllersAuthAuthController as BaseAuthController;

class AuthController extends BaseAuthController // 簡(jiǎn)單起見(jiàn)直接繼承默認(rèn)類
{

    /* 這里的屬性都是給 trait 用的,所以不能指定為 private */
    protected $guard = "admins"; // 指定 config/auth.php 中 guard
    protected $loginView = "admin.auth.login"; // 指定登錄用 view
    protected $registerView = "admin.auth.register"; // 指定注冊(cè)用 view

    protected function validator(array $data) // 注冊(cè)時(shí)使用的驗(yàn)證規(guī)則
    {
        return Validator::make($data, [ // 根據(jù) Admin 所需的信息修改驗(yàn)證配置
            "name" => "required|max:255",
            "email" => "required|email|max:255|unique:admins", // 使用 admins 表
            "password" => "required|confirmed|min:6",
            "terms" => "required",
        ]);
    }

    protected function create(array $data)
    {
        return Admin::create([ // 使用自定義的 Model(Admin)
            "name" => $data["name"],
            "email" => $data["email"],
            "password" => bcrypt($data["password"]),
        ]);
    }
}
Exception

如果需要自定義 error 頁(yè)面(之前把 resources/views/errors 移到 resources/views/admin/errors)的情況下,由于 Laravel 的異常固定由 AppExceptionsHandler 處理,所以需要在此類中針對(duì)不同站點(diǎn)分別指定錯(cuò)誤處理 view。具體來(lái)說(shuō)是修改指定錯(cuò)誤頁(yè)的邏輯,在子類中根據(jù)請(qǐng)求的域名(本例的區(qū)分規(guī)則)指定該站點(diǎn)的錯(cuò)誤頁(yè) view。

app/Exceptions/Handler.php

class Handler extends ExceptionHandler
{
    protected $host;

    public function render($request, Exception $e)
    {
        $this->host = $request->getHost(); // 記錄請(qǐng)求站點(diǎn)的域名
        return parent::render($request, $e);
    }

    protected function renderHttpException(HttpException $e) // 修改并覆蓋父類的方法,用于指定子站點(diǎn)錯(cuò)誤頁(yè) view
    {
        switch($this->host)
        {
            case "admin.example.com": // 針對(duì) Admin 站點(diǎn)指定路徑中的 admin 
                $prefix = "admin";
                break;
        }
        $prefix = empty($prefix) ? "" : $prefix . ".";

        $status = $e->getStatusCode();
        $errorView = $prefix . "errors.{$status}"; // 指定錯(cuò)誤頁(yè) view
        
        if (view()->exists($errorView)) {
            return response()->view($errorView, ["exception" => $e], $status, $e->getHeaders());
        } else {
            return $this->convertExceptionToResponse($e);
        }
    }
}

參考

整個(gè)改造過(guò)程中,主要參考了如下資料來(lái)源,感謝各位作者的同時(shí)也一并放出參考。

Laravel學(xué)院版用戶認(rèn)證文檔

Dearmadman版用戶認(rèn)證文檔(更詳細(xì))

Laravel學(xué)院版驗(yàn)證文檔

Dearmadman版驗(yàn)證文檔(更詳細(xì))

Sun_翁航版多用戶認(rèn)證方案

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21896.html

相關(guān)文章

  • Laravel 用戶字段認(rèn)證優(yōu)雅解決方案

    摘要:弊端顯而易見(jiàn),如果另一個(gè)不是就抓瞎了,下面是另一種通用的解決方案在中重寫方法假設(shè)字段是假設(shè)字段是假設(shè)字段是可以看到雖然能解決問(wèn)題,但是顯然有悖于的優(yōu)雅風(fēng)格,賣了這么多關(guān)子,下面跟大家分享一下我的解決方案。 解決方案: 登錄字段不超過(guò)兩個(gè)的(簡(jiǎn)單的解決方案) 登錄字段大于或等于三個(gè)的(相對(duì)復(fù)雜一些) 登錄字段不超過(guò)兩個(gè)的 我在網(wǎng)上看到一種相對(duì)簡(jiǎn)單解決方案,但是不能解決所有兩個(gè)字段的驗(yàn)...

    jk_v1 評(píng)論0 收藏0
  • 下載量最高 100 個(gè) Laravel 擴(kuò)展包推薦

    摘要:本文經(jīng)授權(quán)轉(zhuǎn)自社區(qū),后續(xù)更新將以帖子內(nèi)容和內(nèi)容為準(zhǔn)。說(shuō)明另一個(gè)令人喜歡的地方,是擁有活躍的開(kāi)發(fā)者社區(qū),而活躍的開(kāi)發(fā)者社區(qū)帶來(lái)的,是繁華的擴(kuò)展包生態(tài)。本文對(duì)上打了標(biāo)簽的擴(kuò)展包進(jìn)行整理,截止到現(xiàn)在年月號(hào),有超過(guò)個(gè)擴(kuò)展包,以下是下載量最大的個(gè)。 本文經(jīng)授權(quán)轉(zhuǎn)自 PHPHub 社區(qū),后續(xù)更新將以 PHPHub 帖子內(nèi)容 和 GitHub 內(nèi)容 為準(zhǔn)。 說(shuō)明 Laravel 另一個(gè)令人喜歡的地方...

    Tychio 評(píng)論0 收藏0
  • PHP / Laravel API 開(kāi)發(fā)推薦閱讀清單

    showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區(qū)優(yōu)秀文章 Laravel 5.5+passport 放棄 dingo 開(kāi)發(fā) API 實(shí)戰(zhàn),讓 API 開(kāi)發(fā)更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項(xiàng)目中使用 - API 文檔撰寫方案 推薦 Laravel API 項(xiàng)目必須使用的 8 個(gè)...

    shmily 評(píng)論0 收藏0
  • Laravel 技巧之 定時(shí)任務(wù)

    摘要:對(duì)于定時(shí)任務(wù)的基本用法,官網(wǎng)文檔已經(jīng)描述得很詳細(xì)了,這里不再多說(shuō)。這種情況下如果定時(shí)任務(wù)能夠并行執(zhí)行,就不會(huì)有這樣的問(wèn)題。這個(gè)時(shí)候我們希望能夠像隊(duì)列那樣,將定時(shí)任務(wù)分散到多臺(tái)服務(wù)器上。 定時(shí)任務(wù) Scheduled Tasks 是 Laravel 提供的組件之一,稍微上點(diǎn)規(guī)模的項(xiàng)目應(yīng)該都會(huì)用到,比如開(kāi)發(fā)微信應(yīng)用時(shí)通過(guò)定時(shí)任務(wù)去刷新access token,比如每天定時(shí)發(fā)推送提現(xiàn)用戶要記...

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

    摘要:因?yàn)榭蛻粝M軌蛑庇^的看到目前購(gòu)物車中商品信息,以便推送優(yōu)惠信息來(lái)促使轉(zhuǎn)化。用戶在商城中的購(gòu)物車數(shù)據(jù)導(dǎo)購(gòu)使用導(dǎo)購(gòu)小程序代用戶下單或結(jié)賬時(shí)加入的購(gòu)物車數(shù)據(jù),不和用戶購(gòu)物車數(shù)據(jù)同步。 iBrand 產(chǎn)品中關(guān)于購(gòu)物車的需求比較復(fù)雜,我們基于 overture/laravel-shopping-cart 擴(kuò)展出了更加符合電商需求的購(gòu)物車包,之前有文章進(jìn)行過(guò)簡(jiǎn)單的介紹: Laravel shop...

    daydream 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<