1. 程式人生 > >laravel5.5 郵箱重置原始碼解析

laravel5.5 郵箱重置原始碼解析

場景:

       laravel原始碼學習觀摩, 選了一段分析一下,也遇到一些問題 mark一下

分析:

     傳送重置密碼的連線  App\Http\Controllers\Auth\[email protected]

     傳送這種連線之前 肯定是需要檢查下填寫的郵箱是不是自己網站的使用者的, 但是這裡面只有一個方法

     trait SendsPasswordResetEmails  程式碼如下:

      $response = $this->broker()->sendResetLink($request->only('email'));  處理郵件傳送

       $this->broker是Password Facade 定義的 (呼叫自身的broker)  

                             先說結論 Illuminate\Auth\Passwords\PasswordBroker 例項                          

<?php
namespace Illuminate\Foundation\Auth;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;

trait SendsPasswordResetEmails
{
    /**
     * Display the form to request a password reset link.
* * @return \Illuminate\Http\Response */ public function showLinkRequestForm() { return view('auth.passwords.email'); } /** * Send a reset link to the given user. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/ public function sendResetLinkEmail(Request $request) { $this->validateEmail($request); // We will send the password reset link to this user. Once we have attempted // to send the link, we will examine the response then see the message we // need to show to the user. Finally, we'll send out a proper response. $response = $this->broker()->sendResetLink( $request->only('email') ); return $response == Password::RESET_LINK_SENT ? $this->sendResetLinkResponse($response) : $this->sendResetLinkFailedResponse($request, $response); } /** * Validate the email for the given request. * * @param \Illuminate\Http\Request $request * @return void */ protected function validateEmail(Request $request) { $this->validate($request, ['email' => 'required|email']); } /** * Get the response for a successful password reset link. * * @param string $response * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse */ protected function sendResetLinkResponse($response) { return back()->with('status', trans($response)); } /** * Get the response for a failed password reset link. * * @param \Illuminate\Http\Request $request * @param string $response * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse */ protected function sendResetLinkFailedResponse(Request $request, $response) { return back()->withErrors( ['email' => trans($response)] ); } /** * Get the broker to be used during password reset. * * @return \Illuminate\Contracts\Auth\PasswordBroker */ public function broker() { return Password::broker(); } }

 而Password Facade  是這樣定義 getFacadeAccessor ; 那麼'auth.password'元件是在註冊的呢     

Illuminate\Auth\Passwords\PasswordResetServiceProvider 
/**
 * Get the registered name of the component.
 *
 * @return string
 */
protected static function getFacadeAccessor()
{
    return 'auth.password';
}

    而在PasswordResetServiceProvider 可以看到 'auth.password' 是  new PasswordBrokerManager($app); 

class PasswordResetServiceProvider extends ServiceProvider
{
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
protected $defer = true;

    /**
     * Register the service provider.
     *
     * @return void
     */
public function register()
    {
        $this->registerPasswordBroker();
    }

    /**
     * Register the password broker instance.
     *
     * @return void
     */
protected function registerPasswordBroker()
    {
        $this->app->singleton('auth.password', function ($app) {
            return new PasswordBrokerManager($app);
        });

        $this->app->bind('auth.password.broker', function ($app) {
            return $app->make('auth.password')->broker();
        });
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
public function provides()
    {
        return ['auth.password', 'auth.password.broker'];
    }
}

        Illuminate\Auth\Passwords\PasswordBrokerManager 的broker 方法 Illuminate\Auth\Passwords\PasswordBroker

        例項  

<?php
namespace Illuminate\Auth\Passwords;

use Illuminate\Support\Str;
use InvalidArgumentException;
use Illuminate\Contracts\Auth\PasswordBrokerFactory as FactoryContract;

/**
 * @mixin \Illuminate\Contracts\Auth\PasswordBroker
 */
class PasswordBrokerManager implements FactoryContract
{
    /**
     * The application instance.
     *
     * @var \Illuminate\Foundation\Application
     */
protected $app;

    /**
     * The array of created "drivers".
     *
     * @var array
     */
protected $brokers = [];

    /**
     * Create a new PasswordBroker manager instance.
     *
     * @param  \Illuminate\Foundation\Application  $app
     * @return void
     */
public function __construct($app)
    {
        $this->app = $app;
    }

    /**
     * Attempt to get the broker from the local cache.
     *
     * @param  string  $name
     * @return \Illuminate\Contracts\Auth\PasswordBroker
     */
public function broker($name = null)
    {
        $name = $name ?: $this->getDefaultDriver();

        return isset($this->brokers[$name])
                    ? $this->brokers[$name]
                    : $this->brokers[$name] = $this->resolve($name);
    }

    /**
     * Resolve the given broker.
     *
     * @param  string  $name
     * @return \Illuminate\Contracts\Auth\PasswordBroker
     *
     * @throws \InvalidArgumentException
     */
protected function resolve($name)
    {
        $config = $this->getConfig($name);

        if (is_null($config)) {
            throw new InvalidArgumentException("Password resetter [{$name}] is not defined.");
        }

        // The password broker uses a token repository to validate tokens and send user
        // password e-mails, as well as validating that password reset process as an
        // aggregate service of sorts providing a convenient interface for resets.
return new PasswordBroker(
            $this->createTokenRepository($config),
            $this->app['auth']->createUserProvider($config['provider'] ?? null)
        );
    }

    /**
     * Create a token repository instance based on the given configuration.
     *
     * @param  array  $config
     * @return \Illuminate\Auth\Passwords\TokenRepositoryInterface
     */
protected function createTokenRepository(array $config)
    {
        $key = $this->app['config']['app.key'];

        if (Str::startsWith($key, 'base64:')) {
            $key = base64_decode(substr($key, 7));
        }

        $connection = $config['connection'] ?? null;

        return new DatabaseTokenRepository(
            $this->app['db']->connection($connection),
            $this->app['hash'],
            $config['table'],
            $key,
            $config['expire']
        );
    }

    /**
     * Get the password broker configuration.
     *
     * @param  string  $name
     * @return array
     */
protected function getConfig($name)
    {
        return $this->app['config']["auth.passwords.{$name}"];
    }

    /**
     * Get the default password broker name.
     *
     * @return string
     */
public function getDefaultDriver()
    {
        return $this->app['config']['auth.defaults.passwords'];
    }

    /**
     * Set the default password broker name.
     *
     * @param  string  $name
     * @return void
     */
public function setDefaultDriver($name)
    {
        $this->app['config']['auth.defaults.passwords'] = $name;
    }

    /**
     * Dynamically call the default driver instance.
     *
     * @param  string  $method
     * @param  array   $parameters
     * @return mixed
     */
public function __call($method, $parameters)
    {
        return $this->broker()->{$method}(...$parameters);
    }
}

相關推薦

laravel5.5 郵箱原始碼解析

場景:       laravel原始碼學習觀摩, 選了一段分析一下,也遇到一些問題 mark一下分析:     傳送重置密碼的連線  App\Http\Controllers\Auth\[email protected]     傳送這種連線之前 肯定是需要檢查下

vCenter Server Appliance 6.5丟失或忘記的 root 密碼

vmware vcenter vcsa root 重置 vCenter Server Appliance 6.5 中重置丟失或忘記的 root 密碼 目前安裝vCenter Server Appliance 6.5客戶原來越多,給用戶配置過程中,往往會忽略默認的root 密碼策略

MySQL 5.7 root使用者密碼

MySQL 5.7 重置root使用者密碼 注:MySQL 8.0 以上版本,請移步:MySQL 8.0 以上版本正確修改 root 密碼 cmd 切換到 mysql\bin 目錄下執行下面語句,用於跳過使用者驗證訪問資料庫(注:如果本機有正在執行的mysql的服務需要先停掉)

Windows下Mysql 5.7密碼

  電腦上安裝了Mysql,mysql資料庫的版本5.7,時間太長之後,忘記了密碼,網上的方法好像因為版本不同都沒法解決,綜合了幾種解決方案之後,終於重置好密碼,步驟如下:   1,,修改為免密登入,在windows中,修改my.ini,在mysqld中增加一行 skip-grant-tables  2.重

win10下,MySQL5.5.61密碼

前段時間要登入MySQL時,發現忘記了密碼,多次上網查資料後並一一驗證,才找到適合我使用的方法。 作業系統:win10 MySQL版本:5.5.61 1. 使用管理員身份執行notepad++,開啟MySQL安裝目錄C:\Program Files\MySQL\MySQL Server 5.5下的配

java web通過163郵箱登入密碼

許多開發專案中都需要用到郵箱實現找回密碼或者重置密碼的功能,就是改變資料庫中儲存的密碼。根據在網上找的一些Javaweb通過郵箱找回密碼的例子並和帶我的研究生學長一起改了改,也成功開發了一個重置密碼的小程式。 開發工具:myeclipse10。MySQL

FMS4.5/AMS5管理員密碼方法

適用於fms4.5和ams5,windows和linux方法一樣,步驟如下: 如果忘記使用者名稱,可通過檢視fms.ini中SERVER.ADMIN_USERNAME段來確認使用者名稱。 然後重置此使用者密碼,比如我這裡為admin 注意:在fms4.5中叫fmsa

MySql 5.7 root密碼

mission 改密 sock plugin 安全 manual var sta -- 一、以安全模式登錄 # Stop MySQL sudo service mysql stop # Make MySQL service directory. sudo mkdir -p

laravel5.5自帶使用者認證密碼時傳送郵件失敗的問題

問題 laravel5.5使用開箱即用的使用者認證時,重置密碼需要傳送郵件,結果報錯,錯誤已經修復,而且當時沒有截圖,所以就不展示啦,反正原因就是因為沒有進行郵件相關的配置,laravel預設是使用SMTP進行郵件傳送,而我使用的是163郵箱,所以接下來就是要在我的163郵箱中開啟SMTP伺服器

laravel5.5 原始碼解析之belongToMany toggle

場景 . 多對多的關係中經常需要用到的一種方式 . 例項 Question Model and Follower Model(問題關注者) 假設點選一個按鈕,則如果使用者已經是關注者,則取消關注 否則成為關注者 分析 1. belongsT

PHPCMS v9.5.8-設計缺陷可前臺任意用戶密碼

mod log val his 手機 index cli exit images 驗證。參考漏洞:http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0152291.html 漏洞出現在/phpcms/modules/membe

centos 7 + mysql 5.7.13 數據庫的root密碼

linux centos7 系統 centos 7 + mysql 5.7.13重置root密碼步驟: # vi /etc/my.cnf # [mysqld]下skip-grant-tables 內容前添加# # mysql -uroot -p 連續輸入enter 進入 # use mysql

Linux 7個運行級別(0:關機,停機模式、1:單用戶模式、2:多用戶模式、3:完整的多用戶文本模式、4:系統未使用,保留一般不用、5:圖形化模式、6:啟模式)、root密碼方法

oca alt 開機重啟 正常 說明 特殊情況 其中 ice root權限 init是Linux系統操作中不可缺少的程序之一。init進程,它是一個由內核啟動的用戶級進程。內核會在過去曾使用過init的幾個地方查找它,它的正確位置(對Linux系統來說)是/

Centos6.5 6.6 (均可) 密碼或強行破解root密碼 簡單操作

丟失 方向 朋友 重啟 ges 無需 shadow order article centos忘記root密碼怎麽重置root密碼? 使用Linux系統的時候root密碼是十分關鍵的安全機制。 但是假設那天丟失了root密碼的話問題就嚴重了。 百牛信息技術baini

VCSA 6.5的SSO Administrator密碼

shell src term host bin upn serve size 字母 重置VCSA 6.5的SSO Administrator密碼的流程如下:1、登錄到VCSA 6.5的命令行界面,輸入“shell”命令激活bash shell,然後來到如下位置確認缺省的額D

ESXi 5.1 root密碼忘記方法

ESXI 5.1此方法適用主機通過vcenter管理且公司有域環境,公司有幾臺vm主機,一直是通過VCENTER管理的,但有一臺主機ROOT密碼忘記了,網上有通過主機配置文件可以修改的方法,但需把主機切換到維護模式,主機上很多服務器在跑,只能找其它方法,ESXI是可以用加入域的,在VCENTER裏設置好DNS

Reset Password 密碼 (CentOS 5,6,7 ; Juniper Networks: SRX100 )

HA OS share pass entos iyu AS 官網 centos 5 一些重置root 密碼的文檔分享(來自官網): CentOS 5,6,7 Juniper Networks : SRX100 鏈接:https://share.weiyun.

自動Language level 5 與 Java Complier 1.5

ron 自動 標簽 重置 con plugins pom.xml 更新 style Intellij IDEA新建Maven項目,總是默認Language level 5 與 Java Compiler 1.5。 以下是兩種修改方式: 1. 手動進行修改:

VCSA vCenter6.5找回root密碼

reboot 參考 技術 ini passwd img gnu 管理 無法 目前安裝vCenter Server Appliance 6.5客戶原來越多,給用戶配置過程中,往往會忽略默認的root 密碼策略:60天過期。一旦密碼過期或忘記密碼,vcsa的管理控制臺就無法通過

以太坊原始碼解讀(5)BlockChain類的解析及NewBlockChain()分析

一、blockchain的資料結構 type BlockChain struct { chainConfig *params.ChainConfig // 初始化配置 cacheConfig *CacheConfig // 快取配置 db ethdb.Databas