簡體   English   中英

在Laravel 5.1中擴展身份驗證

[英]Extending Authentication in Laravel 5.1

我有一個應用程序,類似於托管轉售商得到的東西有所不同...該應用程序用於domainA.com和domainB.com。 兩個域都指向一台服務器,因此兩個站點都運行完全相同的文件和數據庫的單個應用程序。

當用戶訪問domainA.com時,我們會看到domainA的特定首選項,即徽標和配色方案。 同樣適用於domainB.com。

雖然兩個域都使用單個數據庫,但我希望userA能夠使用相同的電子郵件在domainA和domainB上注冊。 當用戶嘗試登錄時,我們將使用類似於以下內容的內容:(摘自http://laravel.com/docs/master/authentication#authenticating-users

Auth::attempt(['email' => $email, 'password' => $password, 'site' => 'domainA.com'])

這是我需要的功能,用於保持數據分離,因此,如果您以屬於domainA.com的adminA身份登錄,您將看到userA在domainA.com上所做的操作,而adminA將看不到userA在domainB.com上進行的操作。 同樣適用於屬於domainB.com的adminB,adminB無法看到userA在domainA.com上所做的操作。

我想知道如果我要使用類似以下內容來更新默認的AuthController @ create方法,那么Laravel 5隨附的整體身份驗證將受到怎樣的影響:

    protected function create(array $data)
    {        
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
            'site' => 'domainB.com'
        ]);
    }

我認為密碼提醒可以輕松更新,但是由於Laravel的身份驗證包括很多內置功能,因此除非使用身份驗證用戶的標識符來標識用戶並執行核心功能,否則這可能會引起問題。


更新/這是我的位置

我已經完成了以下

  1. 在表用戶中刪除數據庫中電子郵件的唯一條件
  2. 更新了登錄和注冊頁面,以包括額外的參數“域”
  3. 在用戶表中添加了新列“域”-現在用戶屬於域
  4. 必須創建中間件以在初始站點訪問時從domains表中查找域id。
  5. 在用戶表中必須有電子郵件和設置的Domain_ID獨特,以防止重復:UNIQUE INDEX unique_email_domain_idemaildomain_id
  6. 注冊頁面上的驗證需要在功能驗證器中為電子郵件進行更新,並替換為類似於'unique:users,email,NULL,id,domain_id,1'的內容

還創建了一個中間件來創建帶有數據的全局域變量,以下是一個初始示例:

<?php

namespace App\Http\Middleware;

use Closure;
use URL;

class DomainRouter
{
    /**
     * Handle an incoming request. Setting up domain for given session.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $domain= \App\Domain::where('domain', URL::to('/'))->firstOrFail();

        # config('domain')->id
        config([
            'domain' => $domain
        ]);

        return $next($request);
    }
}

必須通過重新創建代碼來重新創建登錄,注冊和忘記密碼,這些代碼主要是從核心控制器復制過來的

站點應該與數據庫無關,因為用戶和域之間的數據庫級別沒有關系。

當用戶訪問domainA.com時,我們會看到domainA的特定首選項,即徽標和配色方案。 同樣適用於domainB.com。

雖然兩個域都使用單個數據庫,但我希望userA能夠使用相同的電子郵件在domainA和domainB上注冊。

相反,您要做的就是顯示不同的信息或在域之間提供不同的功能。

相反,您應該做的只是擴展auth函數/過濾器,當用戶登錄到特定域時,您可以先確定當前路由所在的域,然后再應用數據/視圖/功能

例如:

MyController extends Controller
{

       public function view(ViewRepository $view)
    {

           return $view->make('path.to.my.view')
     }
}


}

ViewRepository擴展View的位置,並基於當前路由域覆蓋發送到該視圖的數據。

您可能會非常喜歡並傳入任何域特定的存儲庫文件,該文件將基於兩個域之間的更改充當任何“核心”功能的接口/過濾器。域擴展了您為維護DRY原理而開發的核心類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM