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

資訊專欄INFORMATION COLUMN

Laravel自帶Auth 密碼重置源碼解析及擴(kuò)展實(shí)現(xiàn)手機(jī)號(hào)密碼找回

elliott_hu / 848人閱讀

摘要:到這里自帶的密碼重置的源碼解讀部分就完成了,下面我們就通過(guò)擴(kuò)展一下實(shí)現(xiàn)手機(jī)號(hào)密碼找回和自定義郵件發(fā)送方式找回密碼,根據(jù)上面的代碼解析如果你看懂的話應(yīng)該了解,其實(shí)我們只要擴(kuò)展和就可以了。

本文最早于發(fā)表本人博客: Laravel 自帶 Auth 密碼重置源碼解析及擴(kuò)展實(shí)現(xiàn)手機(jī)號(hào)密碼找回

Larval 自帶 Auth 密碼重置源碼解析及擴(kuò)展實(shí)現(xiàn)手機(jī)號(hào)密碼找回

Larval技術(shù)群小伙伴問(wèn)密碼重置時(shí)PasswordController中需要設(shè)置的$broker是干嘛用的,正好來(lái)寫一下Laravel 中Auth的ResetsPasswords,以及實(shí)踐一下擴(kuò)展,所以大體這篇博客寫寫:

密碼重置源碼分析

實(shí)現(xiàn)自定義郵件發(fā)送方式進(jìn)行密碼重置,比如使用第三方或者自己發(fā)送郵件方式找回

實(shí)現(xiàn)手機(jī)號(hào)密碼重置

首先來(lái)看一下PasswordController 中的 ResetsPasswords trait

trait ResetsPasswords
{
    use RedirectsUsers;

    public function getEmail()
    {
        return $this->showLinkRequestForm();
    }

    /**
     * 這里就是設(shè)置密碼重置郵件內(nèi)容的
     *
     * @return IlluminateHttpResponse
     */
    public function showLinkRequestForm()
    {
        //所以我們可以在PoasswrodController 中設(shè)置 protected $linkRequestView 來(lái)定義密碼重置郵件模板
        if (property_exists($this, "linkRequestView")) {
            return view($this->linkRequestView);
        }

        if (view()->exists("auth.passwords.email")) {
            return view("auth.passwords.email");
        }

        return view("auth.password");
    }

    /**
     * 發(fā)送密碼重置郵件
     *
     * @param  IlluminateHttpRequest  $request
     * @return IlluminateHttpResponse
     */
    public function postEmail(Request $request)
    {
        return $this->sendResetLinkEmail($request);
    }

    /**
     * 給重置密碼的用戶發(fā)送郵件
     *
     * @param  IlluminateHttpRequest  $request
     * @return IlluminateHttpResponse
     */
    public function sendResetLinkEmail(Request $request)
    {
        $this->validate($request, ["email" => "required|email"]);

        $broker = $this->getBroker(); //獲取broker,下面會(huì)講

        $response = Password::broker($broker)->sendResetLink($request->only("email"), function (Message $message) {
            $message->subject($this->getEmailSubject());
        }); //根據(jù) broker 來(lái)發(fā)送密碼重置郵件,下面會(huì)詳細(xì)講

        switch ($response) {
            case Password::RESET_LINK_SENT: //狀態(tài),下面會(huì)講
                return $this->getSendResetLinkEmailSuccessResponse($response);

            case Password::INVALID_USER:
            default:
                return $this->getSendResetLinkEmailFailureResponse($response);
        }
    }

    /**
     * 郵件標(biāo)題
     *
     * @return string
     */
    protected function getEmailSubject()
    {
        return property_exists($this, "subject") ? $this->subject : "Your Password Reset Link";
    }

    /**
     * 郵件成功發(fā)送過(guò)以后返回
     *
     * @param  string  $response
     * @return SymfonyComponentHttpFoundationResponse
     */
    protected function getSendResetLinkEmailSuccessResponse($response)
    {
        return redirect()->back()->with("status", trans($response));
    }

    /**
     * 郵件發(fā)送時(shí)候返回
     *
     * @param  string  $response
     * @return SymfonyComponentHttpFoundationResponse
     */
    protected function getSendResetLinkEmailFailureResponse($response)
    {
        return redirect()->back()->withErrors(["email" => trans($response)]);
    }

    /**
     * 用戶點(diǎn)擊郵箱里面重置連接后跳轉(zhuǎn)的頁(yè)面,就是重置密碼頁(yè)面
     * @param  IlluminateHttpRequest  $request
     * @param  string|null  $token
     * @return IlluminateHttpResponse
     */
    public function getReset(Request $request, $token = null)
    {
        return $this->showResetForm($request, $token);
    }

    /**
     * 用戶點(diǎn)擊郵箱里面重置連接后跳轉(zhuǎn)的頁(yè)面,就是重置密碼頁(yè)面
     *
     * @param  IlluminateHttpRequest  $request
     * @param  string|null  $token
     * @return IlluminateHttpResponse
     */
    public function showResetForm(Request $request, $token = null)
    {
        if (is_null($token)) {
            return $this->getEmail();
        }

        $email = $request->input("email");

        //所以我們可以在PoasswrodController 中設(shè)置 protected $resetView 來(lái)定義密碼重置的頁(yè)面
        if (property_exists($this, "resetView")) {
            return view($this->resetView)->with(compact("token", "email"));
        }
        if (view()->exists("auth.passwords.reset")) {
            return view("auth.passwords.reset")->with(compact("token", "email"));
        }

        return view("auth.reset")->with(compact("token", "email"));
    }

    /**
     * 重置密碼
     *
     * @param  IlluminateHttpRequest  $request
     * @return IlluminateHttpResponse
     */
    public function postReset(Request $request)
    {
        return $this->reset($request);
    }

    /**
     * 重置密碼實(shí)現(xiàn)
     *
     * @param  IlluminateHttpRequest  $request
     * @return IlluminateHttpResponse
     */
    public function reset(Request $request)
    {
        $this->validate($request, [
            "token" => "required",
            "email" => "required|email",
            "password" => "required|confirmed|min:6",
        ]);

        $credentials = $request->only(
            "email", "password", "password_confirmation", "token"
        );

        $broker = $this->getBroker();

        $response = Password::broker($broker)->reset($credentials, function ($user, $password) { //注意這個(gè)回調(diào)
            $this->resetPassword($user, $password);
        }); //根據(jù) broker重置密碼,下面會(huì)詳細(xì)講

        switch ($response) {
            case Password::PASSWORD_RESET:
                return $this->getResetSuccessResponse($response);

            default:
                return $this->getResetFailureResponse($request, $response);
        }
    }

    /**
     * 重置密碼,并且重新登陸
     *
     * @param  IlluminateContractsAuthCanResetPassword  $user
     * @param  string  $password
     * @return void
     */
    protected function resetPassword($user, $password)
    {
        $user->password = bcrypt($password);

        $user->save();

        Auth::guard($this->getGuard())->login($user);
    }

    //下面的代碼略
}

上面其實(shí)就是路由的實(shí)現(xiàn)方法,主要路由如下:

Method URI Action
POST password/email AppHttpControllersAuthPasswordController@sendResetLinkEmail
POST password/reset AppHttpControllersAuthPasswordController@reset
GET HEAD password/reset/{token?}

首先來(lái)主要看下sendResetLinkEmail方法,這個(gè)方法主要實(shí)現(xiàn)根據(jù)用戶填入的郵箱地址來(lái)發(fā)送重置郵件的

$response = Password::broker($broker)->sendResetLink($request->only("email"), function (Message $message) {
            $message->subject($this->getEmailSubject());
        }); //根據(jù) broker 來(lái)發(fā)送密碼重置郵件,下面會(huì)詳細(xì)講

        switch ($response) {
            case Password::RESET_LINK_SENT: //狀態(tài),下面會(huì)講
                return $this->getSendResetLinkEmailSuccessResponse($response);

            case Password::INVALID_USER:
            default:
                return $this->getSendResetLinkEmailFailureResponse($response);
        }

上面的Password 就是Facade,我們看一下這個(gè)Facade:

Illuminate/Support/Facades/Password.php


可以看到上面郵件發(fā)送后等狀態(tài)的判斷也是在這個(gè)Facade中定義的,那么auth.password 的這個(gè)是綁定到哪個(gè)類中實(shí)現(xiàn)的?繼續(xù)查看對(duì)應(yīng)的ServiceProvider的register

Illuminate/Auth/Passwords/PasswordResetServiceProvider.php

registerPasswordBroker();
    }

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

    public function provides()
    {
        return ["auth.password", "auth.password.broker"];
    }
}

看到了PasswordBrokerManager($app);,那么我們就知道了上面Passwrod::broker 的實(shí)現(xiàn)在PasswordBrokerManager中,那我們先來(lái)看下是如何發(fā)送這個(gè)重置密碼郵件的

Illuminate/Auth/Passwords/PasswordBrokerManager.php

getDefaultDriver();

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

    /**
     * Resolve the given broker.
     *
     * @param  string  $name
     * @return IlluminateContractsAuthPasswordBroker
     *
     * @throws InvalidArgumentException
     */
    protected function resolve($name)
    {
        $config = $this->getConfig($name); //獲取auth.php配置中的passwords broker

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

        //這里很重要,就是實(shí)例一個(gè)PasswordBroker
        return new PasswordBroker(
            $this->createTokenRepository($config),
            $this->app["auth"]->createUserProvider($config["provider"]),
            $this->app["mailer"],
            $config["email"]
        );
    }

    /**
     * 根據(jù)配置創(chuàng)建一個(gè)token實(shí)例
     *
     * @param  array  $config
     * @return IlluminateAuthPasswordsTokenRepositoryInterface
     */
    protected function createTokenRepository(array $config)
    {
        return new DatabaseTokenRepository(
            $this->app["db"]->connection(),
            $config["table"],
            $this->app["config"]["app.key"],
            $config["expire"]
        );
    }

    //下面略
   
    public function __call($method, $parameters)
    {
        return call_user_func_array([$this->broker(), $method], $parameters);
    }
}

上面的resolve返回了new PasswordBroker,這里的PasswordBroker其實(shí)才是密碼重置的核心實(shí)現(xiàn),里面主要做了實(shí)現(xiàn)一下幾件事情:

創(chuàng)建郵件驗(yàn)證的token,并發(fā)送重置密碼郵件

用戶點(diǎn)擊重置連接以后根據(jù)token進(jìn)行驗(yàn)證

重置舊的密碼成用戶提交的新密碼

Illuminate/Auth/Passwords/PasswordBroker.php

users = $users;
        $this->mailer = $mailer;
        $this->tokens = $tokens;
        $this->emailView = $emailView;
    }

    /**
     * 給用戶發(fā)送包含重置鏈接的郵件
     *
     * @param  array  $credentials
     * @param  Closure|null  $callback
     * @return string
     */
    public function sendResetLink(array $credentials, Closure $callback = null)
    {
        // 驗(yàn)證用戶
        $user = $this->getUser($credentials);

        if (is_null($user)) {
            return PasswordBrokerContract::INVALID_USER;
        }

        // 生成token
        $token = $this->tokens->create($user);
        //發(fā)送郵件
        $this->emailResetLink($user, $token, $callback);

        return PasswordBrokerContract::RESET_LINK_SENT;
    }

    /**
     * 發(fā)送郵件的實(shí)現(xiàn)
     *
     * @param  IlluminateContractsAuthCanResetPassword  $user
     * @param  string  $token
     * @param  Closure|null  $callback
     * @return int
     */
    public function emailResetLink(CanResetPasswordContract $user, $token, Closure $callback = null)
    {
        //把token和user變量傳遞到郵件模板中,并發(fā)送郵件
        $view = $this->emailView;

        return $this->mailer->send($view, compact("token", "user"), function ($m) use ($user, $token, $callback) {
            $m->to($user->getEmailForPasswordReset());

            if (! is_null($callback)) {
                call_user_func($callback, $m, $user, $token);
            }
        });
    }

    /**
     * 根據(jù)token重置密碼
     *
     * @param  array  $credentials
     * @param  Closure  $callback
     * @return mixed
     */
    public function reset(array $credentials, Closure $callback)
    {
        //實(shí)現(xiàn)根據(jù)$credentials來(lái)驗(yàn)證用戶是否可以更改更改密碼
        $user = $this->validateReset($credentials);

        if (! $user instanceof CanResetPasswordContract) {
            return $user;
        }

        $pass = $credentials["password"];
        
        // 下面這個(gè)就是產(chǎn)生新的密碼的實(shí)現(xiàn)
        call_user_func($callback, $user, $pass); 

        $this->tokens->delete($credentials["token"]);

        return PasswordBrokerContract::PASSWORD_RESET;
    }

    //下面的是一些驗(yàn)證的方法,略
}

上面的reset 中的call_user_func就是調(diào)用了重置新密碼的邏輯,$callback其實(shí)就是最上面的trait ResetsPasswords 中的resetPassword($user, $password)來(lái)保存新密碼。

到這里L(fēng)aravel 自帶Auth的密碼重置的源碼解讀部分就完成了,下面我們就通過(guò)擴(kuò)展一下實(shí)現(xiàn)手機(jī)號(hào)密碼找回和自定義郵件發(fā)送方式找回密碼,根據(jù)上面的代碼解析如果你看懂的話應(yīng)該了解,其實(shí)我們只要擴(kuò)展PasswordBroker.phpPasswordBrokerManager.php就可以了。

自定義郵件發(fā)送和手機(jī)號(hào)發(fā)送驗(yàn)證碼邏輯類請(qǐng)自行實(shí)現(xiàn),以下代碼的EmailService和SmsService分別表示發(fā)送郵件和發(fā)送短信的類,自己按照需求進(jìn)行封裝,比如SendCloud發(fā)送郵件,云通訊發(fā)送手機(jī)短信驗(yàn)證碼的具體實(shí)現(xiàn)

自定義郵件重置密碼的邏輯基本都一樣的,不變,手機(jī)號(hào)重置密碼的過(guò)程應(yīng)該是這樣的:

用戶填入手機(jī)號(hào),點(diǎn)擊“發(fā)送驗(yàn)證碼”按鈕,收到驗(yàn)證碼

將驗(yàn)證碼填入,點(diǎn)擊“密碼找回”

后臺(tái)進(jìn)行驗(yàn)證碼校驗(yàn),沒有問(wèn)題跳轉(zhuǎn)到新密碼設(shè)置頁(yè)面

新密碼設(shè)置

路由如下:

Route::post("password/email", "AuthPasswordController@sendResetLinkEmail");
//通過(guò)郵件重置密碼
Route::post("password/reset-mail", "AuthPasswordController@resetBymail");
//發(fā)送手機(jī)短信驗(yàn)證碼
Route::post("password/phone", "AuthPasswordController@sendResetCodePhone");
//通過(guò)手機(jī)驗(yàn)證碼找回密碼
Route::post("password/reset-phone", "AuthPasswordController@resetByPhone");

在app目錄下建立入如下目錄和文件(根據(jù)個(gè)人習(xí)慣):

Foundation/
├── Auth
?? ├── Passwords
?? ?? ├── RyanPasswordBroker.php
?? ?? ├── RyanPasswordBrokerManager.php
?? ?? └── Facade
?? ??     └── RyanPassword.php

新建ServiceProvider,將auth.password綁定到我們自己的RyanPasswordBroker

app/Providers/RyanPasswordResetServiceProvider.php

registerPasswordBroker();
    }

    protected function registerPasswordBroker()
    {
        $this->app->singleton("auth.password", function ($app) {
            return new RyanPasswordBrokerManager($app);
        });

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

    public function provides()
    {
        return ["auth.password", "auth.password.broker"];
    }
}

修改config/app.php

"providers" => [
        ......
        AppProvidersRyanPasswordResetServiceProvider::class,
    ],

    "aliases" => [
        ......
        "RyanPassword" => AppFoundationAuthPasswordsFacadeRyanPassword::class,
    ],

app/Foundation/Auth/Passwords/Facade/RyanPassword.php


app/Foundation/Auth/Passwords/RyanPasswordBroker.php

users = $users;
        $this->mailer = $mailer;
        $this->tokens = $tokens;
        $this->emailView = $emailView;
    }

  
    public function emailResetLink(CanResetPasswordContract $user, $token, Closure $callback = null)
    {
        $body = app("view")->make($this->emailView, compact("token", "user"))->render();
        return $this->mailer->send($user->getEmailForPasswordReset(), "xxx賬號(hào)密碼重置", $body, $fromName = "xxxx");
    }

    protected function validateReset(array $credentials)
    {
        if (is_null($user = $this->getUser($credentials))) {
            return PasswordBrokerContract::INVALID_USER;
        }

        if (!$this->validateNewPassword($credentials)) {
            return PasswordBrokerContract::INVALID_PASSWORD;
        }

        if (isset($credentials["verify_code"])) {
            //如果提交的字段含有verify_code表示是手機(jī)驗(yàn)證碼方式重置密碼,需要驗(yàn)證用戶提交的驗(yàn)證碼是不是剛才發(fā)送給他手機(jī)號(hào)的,驗(yàn)證碼發(fā)送以后可以保持在緩存中
            if (Redis::get("password:telephone:" . $credentials["telephone"]) != $credentials["verify_code"]) {
                return PasswordBrokerContract::INVALID_TOKEN;
            }
        } elseif (!$this->tokens->exists($user, $credentials["token"])) {
            //郵件重置方式
            return PasswordBrokerContract::INVALID_TOKEN;
        }

        return $user;
    }

    /**
     * Get the user for the given credentials.
     *
     * @param  array $credentials
     * @return IlluminateContractsAuthCanResetPassword
     *
     * @throws UnexpectedValueException
     */
    public function getUser(array $credentials)
    {
        $credentials = Arr::except($credentials, ["token", "verify_code"]);//這里注意,如果是手機(jī)驗(yàn)證碼方式找回密碼需要吧verify_code字段排除,以免users表中沒有verify_code字段查不到用戶

        $user = $this->users->retrieveByCredentials($credentials);

        if ($user && !$user instanceof CanResetPasswordContract) {
            throw new UnexpectedValueException("User must implement CanResetPassword interface.");
        }

        return $user;
    }

    /**
     * 發(fā)送重置密碼手機(jī)驗(yàn)證碼
     *
     * @param  array $credentials
     * @param  Closure|null $callback
     * @return string
     */
    public function sendResetCode(array $credentials, Closure $callback = null)
    {
        $user = $this->getUser($credentials);

        if (is_null($user)) {
            return PasswordBrokerContract::INVALID_USER;
        }
        //我是將手機(jī)驗(yàn)證碼發(fā)送后保持在Redis中,驗(yàn)證的時(shí)候也是去redis取
        $telephone = $credentials["telephone"];
        $code = random_int(100000, 999999);
        $result = with(new SmsService())->sendTemplateSms($telephone, config("sms.template_ids.password_verify_code"), [$code]);
        $result = json_decode($result, true);
        if ($result["status"]) {
            Redis::setEx("password:telephone:" . $telephone, 3000, $code);
            return PasswordBrokerContract::RESET_LINK_SENT;
        }
    }

    /**
     * 通過(guò)手機(jī)驗(yàn)證碼重置密碼
     * @param array $credentials
     * @param Closure $callback
     * @return CanResetPasswordContract|string
     */
    public function resetByPhone(array $credentials, Closure $callback)
    {
        $user = $this->validateReset($credentials);

        if (!$user instanceof CanResetPasswordContract) {
            return $user;
        }


        $pass = $credentials["password"];

        call_user_func($callback, $user, $pass);
        //如果是手機(jī)號(hào)重置密碼的話新密碼保存后需要?jiǎng)h除緩存的驗(yàn)證碼
        Redis::del("password:telephone:" . $credentials["telephone"]);

        return PasswordBrokerContract::PASSWORD_RESET;
    }

}

app/Foundation/Auth/Passwords/RyanPasswordBrokerManager.php

mailer = new EmailService();
    }

    /**
     * Attempt to get the broker from the local cache.
     *
     * @param  string $name
     * @return IlluminateContractsAuthPasswordBroker
     */
    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 IlluminateContractsAuthPasswordBroker
     *
     * @throws InvalidArgumentException
     */
    protected function resolve($name)
    {
        $config = $this->getConfig($name);

        if(is_null($config)) {
            throw new InvalidArgumentException("Password resetter [{$name}] is not defined.");
        }
      
        //這里實(shí)例化我們自定義的RyanPasswordBroker來(lái)完成密碼重置邏輯
        return new RyanPasswordBroker($this->createTokenRepository($config), $this->app["auth"]->createUserProvider($config["provider"]), $this->mailer, $config["email"]);
    }
}

修改PasswordController.php

middleware("guest");
    }


    /**
     * 發(fā)送重置密碼郵件
     *
     * @param  IlluminateHttpRequest $request
     * @return IlluminateHttpResponse
     */
    public function sendResetLinkEmail(EmailResetPasswordSendRequest $request)
    {
        $broker = $this->getBroker();

        $response = RyanPassword::broker($broker)->sendResetLink($request->only("email"));

        switch ($response) {
            case RyanPassword::RESET_LINK_SENT:
                return ["status_code" => "200", "message" => "密碼重置郵件已發(fā)送"];

            case RyanPassword::INVALID_USER:
            default:
                throw new UnauthorizedHttpException(401, "該郵箱未注冊(cè)");
        }
    }


    /**
     * 通過(guò)郵件重置密碼
     *
     * @param  IlluminateHttpRequest $request
     * @return IlluminateHttpResponse
     */
    public function resetBymail(EmailResetPasswordRequest $request)
    {
        $credentials = $request->only("email", "password", "password_confirmation", "token");

        $broker = $this->getBroker();

        $response = RyanPassword::broker($broker)->reset($credentials, function ($user, $password) {
            $this->resetPassword($user, $password);
        });

        switch ($response) {
            case RyanPassword::PASSWORD_RESET:
                unset($credentials["token"]);
                unset($credentials["password_confirmation"]);
                return [
                    "status_code" => "200",
                    "message" => "密碼重置成功"
                ];

            case RyanPassword::INVALID_TOKEN:
                //返回"Token 已經(jīng)失效"

            default:
                //返回"密碼重置失敗"
        }
    }


    /**
     *  發(fā)送重置密碼短信驗(yàn)證碼
     *
     * @param  IlluminateHttpRequest $request
     * @return IlluminateHttpResponse
     */
    public function sendResetCodePhone(PhoneResetPasswordSendRequest $request)
    {
        $broker = $this->getBroker();

        $response = RyanPassword::broker($broker)->sendResetCode($request->only("telephone"));

        switch ($response) {
            case RyanPassword::RESET_LINK_SENT:
                return ["status_code" => "200", "message" => "密碼重置驗(yàn)證碼已發(fā)送"];

            case RyanPassword::INVALID_USER:
            default:
                //返回"該手機(jī)號(hào)未注冊(cè)"
        }
    }


    /**
     * 通過(guò)短信驗(yàn)證碼重置密碼
     * @param PhoneResetPasswordRequest $request
     * @return array
     */
    public function resetByPhone(PhoneResetPasswordRequest $request)
    {
        $credentials = $request->only("telephone", "password", "password_confirmation", "verify_code");

        $broker = $this->getBroker();

        $response = RyanPassword::broker($broker)->resetByPhone($credentials, function ($user, $password) {
            $this->resetPassword($user, $password);
        });

        switch ($response) {
            case RyanPassword::PASSWORD_RESET:
                unset($credentials["verify_code"]);
                unset($credentials["password_confirmation"]);
                return [
                    "status_code" => "200",
                    "message" => "密碼重置成功",
                ];

            case RyanPassword::INVALID_TOKEN:
                //返回"手機(jī)驗(yàn)證碼已失效"

            default:
                //返回"密碼重置失敗"
        }
    }

}

結(jié)束!!

轉(zhuǎn)載請(qǐng)注明:?轉(zhuǎn)載自Ryan是菜鳥 | LNMP技術(shù)棧筆記

如果覺得本篇文章對(duì)您十分有益,何不 打賞一下

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

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

相關(guān)文章

  • Laravel核心解讀 -- 用戶認(rèn)證系統(tǒng)(基礎(chǔ)介紹)

    摘要:系統(tǒng)的核心是由的認(rèn)證組件的看守器和提供器組成。使用的認(rèn)證系統(tǒng),幾乎所有東西都已經(jīng)為你配置好了。其配置文件位于,其中包含了用于調(diào)整認(rèn)證服務(wù)行為的注釋清晰的選項(xiàng)配置。 用戶認(rèn)證系統(tǒng)(基礎(chǔ)介紹) 使用過(guò)Laravel的開發(fā)者都知道,Laravel自帶了一個(gè)認(rèn)證系統(tǒng)來(lái)提供基本的用戶注冊(cè)、登錄、認(rèn)證、找回密碼,如果Auth系統(tǒng)里提供的基礎(chǔ)功能不滿足需求還可以很方便的在這些基礎(chǔ)功能上進(jìn)行擴(kuò)展。這篇...

    RebeccaZhong 評(píng)論0 收藏0
  • GitChat · 安全 | 聊聊 「密碼找回

    摘要:微信任意用戶密碼修改漏洞漏洞描述在微信官方的首頁(yè)上發(fā)現(xiàn)了找回密碼功能。選擇通過(guò)手機(jī)號(hào)碼找回密碼。提交成功,輸入新密碼。網(wǎng)易郵箱可直接修改其他用戶密碼描述這次我們看一個(gè)郵箱的找回密碼漏洞,這個(gè)還真和上面的方式有點(diǎn)不一樣。 來(lái)自 GitChat 作者:湯青松更多使用技術(shù),盡在微信公眾號(hào):GitChat技術(shù)雜談 進(jìn)入 GitChat 閱讀原文 WEB安全用戶密碼找回多案例安全攻防實(shí)戰(zhàn) 這次文...

    YorkChen 評(píng)論0 收藏0
  • Laravel核心解讀 -- 擴(kuò)展用戶認(rèn)證系統(tǒng)

    摘要:擴(kuò)展用戶認(rèn)證系統(tǒng)上一節(jié)我們介紹了系統(tǒng)實(shí)現(xiàn)的一些細(xì)節(jié)知道了是如何應(yīng)用看守器和用戶提供器來(lái)進(jìn)行用戶認(rèn)證的,但是針對(duì)我們自己開發(fā)的項(xiàng)目或多或少地我們都會(huì)需要在自帶的看守器和用戶提供器基礎(chǔ)之上做一些定制化來(lái)適應(yīng)項(xiàng)目,本節(jié)我會(huì)列舉一個(gè)在做項(xiàng)目時(shí)遇到的 擴(kuò)展用戶認(rèn)證系統(tǒng) 上一節(jié)我們介紹了Laravel Auth系統(tǒng)實(shí)現(xiàn)的一些細(xì)節(jié)知道了Laravel是如何應(yīng)用看守器和用戶提供器來(lái)進(jìn)行用戶認(rèn)證的,但是...

    王偉廷 評(píng)論0 收藏0
  • 20151103addinfo-laravel小練習(xí)-小結(jié)

    摘要:學(xué)習(xí)了一段時(shí)間的小結(jié)一下最近做的小任務(wù)寫下來(lái)才知道好亂糟糟,還是以記錄學(xué)習(xí)的資料為主,寫的很糟糕,還需要再揣度多屢屢思路。 學(xué)習(xí)了一段時(shí)間的laravel,小結(jié)一下最近做的laravel小任務(wù),寫下來(lái)才知道好亂糟糟,還是以記錄學(xué)習(xí)的資料為主,寫的很糟糕,還需要再揣度多屢屢思路。20151103-16 源碼地址:https://github.com/dingyiming/xc-add...

    jackzou 評(píng)論0 收藏0
  • laravel auth 認(rèn)證

    摘要:如果兩個(gè)經(jīng)哈希運(yùn)算的密碼相匹配那么將會(huì)為這個(gè)用戶開啟一個(gè)認(rèn)證。如果認(rèn)證成功的話方法將會(huì)返回。重定向器上的方法將用戶重定向到登錄之前用戶想要訪問(wèn)的,在目標(biāo)無(wú)效的情況下回退將會(huì)傳遞給該方法。最后如有錯(cuò)誤,歡迎指出交流群 Auth認(rèn)證 路由 從路由開始,找到源碼,再進(jìn)行研究找到根目錄下面的 vendor/laravel/framework/src/Illuminate/Routing/Rou...

    Lionad-Morotar 評(píng)論0 收藏0

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

0條評(píng)論

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