>  기사  >  백엔드 개발  >  Laravel 사용자 인증 시스템(기본 소개)

Laravel 사용자 인증 시스템(기본 소개)

不言
不言원래의
2018-07-06 14:18:413438검색

이 글은 주로 Laravel 사용자 인증 시스템(기본 소개)을 소개하며, 이는 특정 참조 가치가 있습니다. 이제 필요한 친구들은

사용자 인증 시스템(기본)을 참조할 수 있습니다. 소개)

Laravel을 사용해 본 개발자라면 Laravel에 기본적인 사용자 등록, 로그인, 인증, 비밀번호 검색 등을 제공하는 인증 시스템이 있다는 것을 알고 계실 것입니다. 충족되지 않으면 이러한 기본 기능을 쉽게 확장할 수 있습니다. 이 글에서는 먼저 Laravel Auth 시스템의 핵심 구성요소를 살펴보겠습니다.

인증 시스템의 핵심은 Laravel 인증 구성 요소의 "보호자"와 "제공자"로 구성됩니다. 감시자는 각 요청에 대해 사용자를 인증하는 방법을 정의합니다. 예를 들어, Laravel의 자체 세션 가드는 상태를 유지하기 위해 세션 저장소와 쿠키를 사용합니다.

다음 표에는 Laravel 인증 시스템의 핵심 구성 요소가 나열되어 있습니다.

AuthAuthManager의 외관# 🎜🎜 #AuthManagerGuard #🎜 🎜#사용자 공급자사용자 공급자는 영구 저장소 데이터에서 사용자를 검색하는 방법을 정의합니다

이 기사에서는 이러한 핵심 구성 요소를 자세히 소개한 다음 기사 마지막 부분에 제공된 표에 각 구성 요소의 기능 세부 정보를 업데이트합니다.

인증 시스템 사용 시작

새 Laravel 애플리케이션에서 php artisan make:authphp artisan migration 명령을 실행하여 프로젝트의 인증 시스템 요구 사항을 생성하세요. 라우팅과 뷰, 데이터 테이블. php artisan make:auth 和 php artisan migrate 命令就能够在项目里生成Auth系统需要的路由和视图以及数据表。

php artisan make:auth执行后会生成Auth认证系统需要的视图文件,此外还会在路由文件web.php中增加响应的路由:

Auth::routes();

Auth Facade文件中单独定义了routes这个静态方法

public static function routes()
{
    static::$app->make('router')->auth();
}

所以Auth具体的路由方法都定义在IlluminateRoutingRouterauth方法中,关于如何找到Facade类代理的实际类可以翻看之前Facade源码分析的章节。

namespace Illuminate\Routing;
class Router implements RegistrarContract, BindingRegistrar
{
    /**
     * Register the typical authentication routes for an application.
     *
     * @return void
     */
    public function auth()
    {
        // Authentication Routes...
        $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
        $this->post('login', 'Auth\LoginController@login');
        $this->post('logout', 'Auth\LoginController@logout')->name('logout');

        // Registration Routes...
        $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
        $this->post('register', 'Auth\RegisterController@register');

        // Password Reset Routes...
        $this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
        $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
        $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
        $this->post('password/reset', 'Auth\ResetPasswordController@reset');
    }
}

auth方法里可以清晰的看到认证系统里提供的所有功能的路由URI以及对应的控制器和方法。

使用Laravel的认证系统,几乎所有东西都已经为你配置好了。其配置文件位于 config/auth.php,其中包含了用于调整认证服务行为的注释清晰的选项配置。

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | 认证的默认配置
    |--------------------------------------------------------------------------
    |
    | 设置了认证用的默认"看守器"和密码重置的选项
    |
    */

    &#39;defaults&#39; => [
        &#39;guard&#39; => &#39;web&#39;,
        &#39;passwords&#39; => &#39;users&#39;,
    ],

    /*
    |--------------------------------------------------------------------------
    | Authentication Guards
    |--------------------------------------------------------------------------
    |
    | 定义项目使用的认证看守器,默认的看守器使用session驱动和Eloquent User 用户数据提供者
    |
    | 所有的驱动都有一个用户提供者,它定义了如何从数据库或者应用使用的持久化用户数据的存储中取出用户信息
    |
    | Supported: "session", "token"
    |
    */

    &#39;guards&#39; => [
        &#39;web&#39; => [
            &#39;driver&#39; => &#39;session&#39;,
            &#39;provider&#39; => &#39;users&#39;,
        ],

        &#39;api&#39; => [
            &#39;driver&#39; => &#39;token&#39;,
            &#39;provider&#39; => &#39;users&#39;,
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | User Providers
    |--------------------------------------------------------------------------
    |
    | 所有的驱动都有一个用户提供者,它定义了如何从数据库或者应用使用的持久化用户数据的存储中取出用户信息
    |
    | Laravel支持通过不同的Guard来认证用户,这里可以定义Guard的用户数据提供者的细节:
    |        使用什么driver以及对应的Model或者table是什么
    |
    | Supported: "database", "eloquent"
    |
    */

    &#39;providers&#39; => [
        &#39;users&#39; => [
            &#39;driver&#39; => &#39;eloquent&#39;,
            &#39;model&#39; => App\Models\User::class,
        ],

        // &#39;users&#39; => [
        //     &#39;driver&#39; => &#39;database&#39;,
        //     &#39;table&#39; => &#39;users&#39;,
        // ],
    ],

    /*
    |--------------------------------------------------------------------------
    | 重置密码相关的配置
    |--------------------------------------------------------------------------
    |
    */

    &#39;passwords&#39; => [
        &#39;users&#39; => [
            &#39;provider&#39; => &#39;users&#39;,
            &#39;table&#39; => &#39;password_resets&#39;,
            &#39;expire&#39; => 60,
        ],
    ],

];

Auth系统的核心是由 Laravel 的认证组件的「看守器」和「提供器」组成。看守器定义了该如何认证每个请求中用户。例如,Laravel 自带的 session 看守器会使用 session 存储和 cookies 来维护状态。

提供器中定义了该如何从持久化的存储数据中检索用户。Laravel 自带支持使用 Eloquent 和数据库查询构造器来检索用户。当然,你可以根据需要自定义其他提供器。

所以上面的配置文件的意思是Laravel认证系统默认使用了web guard配置项, 配置项里使用的是看守器是SessionGuard,使用的用户提供器是EloquentProvider 提供器使用的model是AppUser

Guard

看守器定义了该如何认证每个请求中用户。Laravel自带的认证系统默认使用自带的 SessionGuardSessionGuard除了实现IlluminateContractsAuth契约里的方法还实现IlluminateContractsAuthStatefulGuardIlluminateContractsAuthSupportsBasicAuth契约里的方法,这些Guard Contracts里定义的方法都是Laravel Auth系统默认认证方式依赖的基础方法。

我们先来看一下这一些基础方法都意欲完成什么操作,等到分析Laravel是如何通过SessionGuard认证用户时在去关系这些方法的具体实现。

IlluminateContractsAuthGuard

这个文件定义了基础的认证方法

namespace Illuminate\Contracts\Auth;

interface Guard
{
    /**
     * 返回当前用户是否时已通过认证,是返回true,否者返回false
     *
     * @return bool
     */
    public function check();

    /**
     * 验证是否时访客用户(非登录认证通过的用户)
     *
     * @return bool
     */
    public function guest();

    /**
     * 获取当前用户的用户信息数据,获取成功返回用户User模型实例(\App\User实现了Authenticatable接口)
     * 失败返回null
     * @return \Illuminate\Contracts\Auth\Authenticatable|null
     */
    public function user();

    /**
     * 获取当前认证用户的用户ID,成功返回ID值,失败返回null
     *
     * @return int|null
     */
    public function id();

    /**
     * 通过credentials(一般是邮箱和密码)验证用户
     *
     * @param  array  $credentials
     * @return bool
     */
    public function validate(array $credentials = []);

    /**
     * 将一个\App\User实例设置成当前的认证用户
     *
     * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
     * @return void
     */
    public function setUser(Authenticatable $user);
}

IlluminateContractsAuthStatefulGuard

这个Contracts定义了Laravel auth系统里认证用户时使用的方法,除了认证用户外还会涉及用户认证成功后如何持久化用户的认证状态。

<?php

namespace Illuminate\Contracts\Auth;

interface StatefulGuard extends Guard
{
    /**
     * Attempt to authenticate a user using the given credentials.
     * 通过给定用户证书来尝试认证用户,如果remember为true则在一定时间内记住登录用户
     * 认证通过后会设置Session和Cookies数据
     * @param  array  $credentials
     * @param  bool   $remember
     * @return bool
     */
    public function attempt(array $credentials = [], $remember = false);

    /**
     * 认证用户,认证成功后不会设置session和cookies数据
     *
     * @param  array  $credentials
     * @return bool
     */
    public function once(array $credentials = []);

    /**
     * 登录用户(用户认证成功后设置相应的session和cookies)
     *
     * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
     * @param  bool  $remember
     * @return void
     */
    public function login(Authenticatable $user, $remember = false);

    /**
     * 通过给定的用户ID登录用户
     *
     * @param  mixed  $id
     * @param  bool   $remember
     * @return \Illuminate\Contracts\Auth\Authenticatable
     */
    public function loginUsingId($id, $remember = false);

    /**
     * 通过给定的用户ID登录用户并且不设置session和cookies
     *
     * @param  mixed  $id
     * @return bool
     */
    public function onceUsingId($id);

    /**
     * Determine if the user was authenticated via "remember me" cookie.
     * 判断用户是否时通过name为"remeber me"的cookie值认证的
     * @return bool
     */
    public function viaRemember();

    /**
     * 登出用户
     *
     * @return void
     */
    public function logout();
}

IlluminateContractsAuthSupportsBasicAuth

定义了通过Http Basic Auth 认证用户的方法

namespace Illuminate\Contracts\Auth;

interface SupportsBasicAuth
{
    /**
     * 尝试通过HTTP Basic Auth来认证用户
     *
     * @param  string  $field
     * @param  array  $extraConditions
     * @return \Symfony\Component\HttpFoundation\Response|null
     */
    public function basic($field = &#39;email&#39;, $extraConditions = []);

    /**
     * 进行无状态的Http Basic Auth认证 (认证后不会设置session和cookies)
     *
     * @param  string  $field
     * @param  array  $extraConditions
     * @return \Symfony\Component\HttpFoundation\Response|null
     */
    public function onceBasic($field = &#39;email&#39;, $extraConditions = []);
}

User Provider

用户提供器中定义了该如何从持久化的存储数据中检索用户,Laravel定义了用户提供器契约(interface),所有用户提供器都要实现这个接口里定义的抽象方法,因为实现了统一的接口所以使得无论是Laravel 自带的还是自定义的用户提供器都能够被Guard使用。

用户提供器契约

如下是契约中定义的必需被用户提供器实现的抽象方法:

<?php

namespace Illuminate\Contracts\Auth;

interface UserProvider
{
    /**
     * 通过用户唯一ID获取用户数据
     *
     * @param  mixed  $identifier
     * @return \Illuminate\Contracts\Auth\Authenticatable|null
     */
    public function retrieveById($identifier);

    /**
     * Retrieve a user by their unique identifier and "remember me" token.
     * 通过Cookies中的"remeber me"令牌和用户唯一ID获取用户数据
     * @param  mixed   $identifier
     * @param  string  $token
     * @return \Illuminate\Contracts\Auth\Authenticatable|null
     */
    public function retrieveByToken($identifier, $token);

    /**
     * 更新数据存储中给定用户的remeber me令牌
     *
     * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
     * @param  string  $token
     * @return void
     */
    public function updateRememberToken(Authenticatable $user, $token);

    /**
     * 通过用户证书获取用户信息
     *
     * @param  array  $credentials
     * @return \Illuminate\Contracts\Auth\Authenticatable|null
     */
    public function retrieveByCredentials(array $credentials);

    /**
     * 验证用户的证书
     *
     * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
     * @param  array  $credentials
     * @return bool
     */
    public function validateCredentials(Authenticatable $user, array $credentials);
}

通过配置文件config/auth.php可以看到Laravel默认使用的用户提供器是IlluminateAuthEloquentUserProvider , 下一章节我们分析Laravel Auth系统实现细节的时候我们再来看看EloquentUserProvider

php artisan make:auth는 실행 후 인증 인증 시스템에 필요한 보기 파일을 생성합니다. 또한 응답 경로는 web.php라우팅 파일에 추가됩니다. >:

rrreee

Auth 정적 메서드인 routes는 Facade 파일에 별도로 정의되어 있습니다

rrreee

따라서 Auth의 구체적인 라우팅 메서드는 에 정의되어 있습니다. code>IlluminateRoutingRouter auth 메소드에서 Facade 클래스 프록시의 실제 클래스를 찾는 방법은 Facade 소스 코드 분석의 이전 장을 참조할 수 있습니다. 🎜rrreee🎜auth 메소드에서는 인증 시스템에서 제공하는 모든 기능의 라우팅 URI와 해당 컨트롤러 및 메소드를 명확하게 확인할 수 있습니다. 🎜🎜Laravel의 인증 시스템을 사용하면 거의 모든 것이 이미 구성되어 있습니다. 구성 파일은 config/auth.php에 있으며 인증 서비스의 동작을 조정하기 위해 명확하게 설명된 구성 옵션이 포함되어 있습니다. 🎜rrreee🎜인증 시스템의 핵심은 Laravel 인증 구성 요소의 "보호자"와 "제공자"로 구성됩니다. 감시자는 각 요청에 대해 사용자를 인증하는 방법을 정의합니다. 예를 들어, Laravel의 자체 session 감시자는 상태를 유지하기 위해 세션 저장소와 쿠키를 사용합니다. 🎜🎜공급자는 영구 저장소 데이터에서 사용자를 검색하는 방법을 정의합니다. Laravel은 Eloquent와 데이터베이스 쿼리 빌더를 사용하여 사용자 검색을 지원합니다. 물론 필요에 따라 다른 공급자를 맞춤설정할 수도 있습니다. 🎜🎜위 구성 파일은 Laravel 인증 시스템이 기본적으로 웹 가드 구성 항목을 사용한다는 것을 의미합니다. 구성 항목에 사용되는 가드는 SessionGuard이고 사용되는 사용자 공급자는 EloquentProvider 공급자입니다. AppUser입니다. 🎜🎜Guard🎜🎜 가드는 각 요청에 대해 사용자를 인증하는 방법을 정의합니다. Laravel과 함께 제공되는 인증 시스템은 기본적으로 IlluminateContractsAuth 계약의 메서드를 구현하는 것 외에도 SessionGuard를 사용합니다. Guard Contracts에 정의된 이러한 메소드는 Laravel Auth 시스템의 기본 인증 메소드에 의존하는 기본 메소드입니다. 🎜🎜 먼저 이러한 기본 메소드가 수행하려는 작업이 무엇인지 살펴보고, Laravel이 SessionGuard를 통해 사용자를 인증하는 방법을 분석하면 이러한 메소드의 구체적인 구현을 알게 될 것입니다. 🎜

IlluminateContractsAuthGuard

🎜이 파일은 기본 인증 방법을 정의합니다🎜rrreee

IlluminateContractsAuthStatefulGuard

🎜이 계약은 Laravel 인증 시스템에서 사용자를 인증하는 데 사용되는 방법을 정의합니다. 또한 성공적인 사용자 인증 후 사용자의 인증 상태를 유지하는 방법도 포함됩니다. 🎜rrreee

IlluminateContractsAuthSupportsBasicAuth

🎜는 HTTP 기본 인증을 통해 사용자를 인증하는 방법을 정의합니다. 🎜rrreee🎜User Provider🎜🎜사용자 공급자는 영구 저장소 데이터에서 사용자를 검색하는 방법을 정의하고, Laravel은 사용자 공급자 계약(인터페이스)을 정의합니다. 모든 사용자 공급자는 이 인터페이스에 정의된 추상 메서드를 구현해야 합니다. 통합 인터페이스가 구현되므로 Laravel의 자체 사용자 공급자와 사용자 정의 사용자 공급자를 모두 Guard에서 사용할 수 있습니다. 🎜

사용자 공급자 계약

🎜다음은 사용자 공급자가 구현해야 하는 계약에 정의된 추상 메서드입니다.🎜rrreee🎜구성 파일 config/auth.php를 통해 확인할 수 있습니다. Laravel에서 기본적으로 사용하는 사용자 공급자는 IlluminateAuthEloquentUserProvider입니다. 다음 장에서 Laravel Auth 시스템의 구현 세부 사항을 분석할 때 EloquentUserProvider는 추상 메서드의 사용자 공급자 계약을 구현합니다. 🎜🎜Summary🎜🎜이 섹션에서는 인증 시스템의 핵심 구성 요소인 감시자 및 공급자를 포함하여 Laravel 인증 시스템의 기본 사항을 주로 소개합니다. AuthManager는 구성 파일에 지정된 감시자를 호출하여 사용자 인증을 완료합니다. 인증 과정에서 필요한 사용자 데이터는 사용자 공급자를 통해 경비원이 획득합니다. 다음 표에는 인증 시스템의 핵심 구성 요소와 각 구성 요소의 역할이 요약되어 있습니다. 🎜<table> <thead><tr class="firstRow"> <th>Name</th> <th>Function</th> </tr></thead> <tbody> <tr> <td>Auth</td> <td>Facade of AuthManager</td> </tr> <tr> <td>AuthManager</td> <td>인증 시스템이 모든 Auth 사용자 인증 관련 방법을 제공하는 인증 시스템의 외부 인터페이스입니다. 인증 방법의 구체적인 구현 세부 사항은 그것이 나타내는 특정 가드(Guard)에 의해 완성됩니다. </td> </tr> <tr> <td>Guard</td> <td> 가드는 각 요청에서 사용자를 인증하는 방법을 정의합니다. 인증에 필요한 사용자 데이터는 사용자 데이터 공급자를 통해 획득됩니다. </td> </tr> <tr> <td>사용자 공급자</td> <td> 사용자 공급자는 영구 저장소 데이터에서 사용자를 검색하는 방법을 정의합니다. Guard가 사용자를 인증하면 공급자를 통해 사용자의 데이터를 검색합니다. 모든 공급자는 특정 구현을 제공하는 IlluminateContractsAuthUserProvider 인터페이스를 구현합니다. 영구 저장소에서 사용자 데이터를 검색하는 방법에 대해 자세히 설명합니다. </td> </tr> </tbody> </table> <p>다음 장에서는 라라벨 자체 사용자 인증 기능의 구현 내용을 자세히 살펴보겠습니다. </p> <p>위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요! </p> <p>관련 권장 사항: </p> <p><a title="Laravel用户认证系统的实现细节" href="http://www.php.cn/php-weizijiaocheng-406076.html" target="_blank"> Laravel 사용자 인증 시스템 구현 세부 정보 </a><br></p> <p><a title="Laravel微信小程序获取用户详细信息及带参数小程序码扩展的分析" href="http://www.php.cn/php-weizijiaocheng-406073.html" target="_blank"> 사용자 세부 정보를 얻는 Laravel WeChat 애플릿 분석 및 매개변수화된 애플릿 코드 확장 </a><br></p>
Name Function # 🎜🎜#
인증 시스템이 모든 Auth 사용자 인증 관련 방법을 애플리케이션에 제공하는 인증 시스템의 외부 인터페이스이며, 인증 방법의 구체적인 구현 세부 사항은 다음과 같습니다. 완료하기 위해 나타내는 특정 가드(Guard)입니다.
경비원은 각 요청에서 사용자를 인증하는 방법을 정의합니다.

위 내용은 Laravel 사용자 인증 시스템(기본 소개)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.