>  기사  >  백엔드 개발  >  Laravel 프레임워크 사용자 로그인 인증

Laravel 프레임워크 사용자 로그인 인증

巴扎黑
巴扎黑원래의
2018-05-15 09:22:481881검색

이 글은 주로 Laravel 프레임워크에서의 사용자 로그인 인증 구현 방법을 소개하며, Laravel 프레임워크에서 사용자 로그인 인증의 원리, 구현 방법 및 관련 주의 사항을 예시 형태로 분석합니다. 이 문서에서는 사용자 로그인 인증 구현 방법의 예와 함께 Laravel 프레임워크를 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

사용자가 laravel에 로그인했는지 여부를 감지하려면 다음 코드가 있습니다.

if ( !Auth::guest() )
{
  return Redirect::to('/dashboard');
}

Auth::guest가 어떻게 호출되나요? ?

Laravel은 Facade 모드를 사용합니다. laravel/framework/src/Illuminate/Support/Facades 폴더에 정의된 Auth 클래스 정의를 살펴보세요. Auth::guest是如何调用的呢?

laravel用了Facade模式,相关门面类在laravel/framework/src/Illuminate/Support/Facades文件夹定义的,看下Auth类的定义:

class Auth extends Facade {
  /**
   * Get the registered name of the component.
   *
   * @return string
   */
  protected static function getFacadeAccessor() { return 'auth'; }
}

laravel框架中,Facade模式使用反射,相关方法其实调用app['auth']中的方法,app['auth']是什么时候创建的呢,

AuthServiceProvider::register方法会注册:

$this->app->bindShared('auth', function($app)
{
  // Once the authentication service has actually been requested by the developer
  // we will set a variable in the application indicating such. This helps us
  // know that we need to set any queued cookies in the after event later.
  $app['auth.loaded'] = true;
  return new AuthManager($app);
});

那为什么最终会调到哪里呢,看下堆栈:

Illuminate\Support\Facades\Auth::guest()
Illuminate\Support\Facades\Facade::__callStatic
Illuminate\Auth\AuthManager->guest()
Illuminate\Support\Manager->__call
public function __call($method, $parameters)
{
    return call_user_func_array(array($this->driver(), $method), $parameters);
}

看下driver的代码:

public function driver($driver = null)
{
    $driver = $driver ?: $this->getDefaultDriver();
    // If the given driver has not been created before, we will create the instances
    // here and cache it so we can return it next time very quickly. If there is
    // already a driver created by this name, we'll just return that instance.
    if ( ! isset($this->drivers[$driver]))
    {
      $this->drivers[$driver] = $this->createDriver($driver);
    }
    return $this->drivers[$driver];
}

没有会调用getDefaultDrive方法

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

最终调用的是配置文件中配置的driver,如果配的是

'driver' => 'eloquent'

则调用的是

public function createEloquentDriver()
{
    $provider = $this->createEloquentProvider();
    return new Guard($provider, $this->app['session.store']);
}

所以Auth::guest最终调用的是Guard::guest

public function user()
{
    if ($this->loggedOut) return;
    // If we have already retrieved the user for the current request we can just
    // return it back immediately. We do not want to pull the user data every
    // request into the method because that would tremendously slow an app.
    if ( ! is_null($this->user))
    {
      return $this->user;
    }
    $id = $this->session->get($this->getName());
    // First we will try to load the user using the identifier in the session if
    // one exists. Otherwise we will check for a "remember me" cookie in this
    // request, and if one exists, attempt to retrieve the user using that.
    $user = null;
    if ( ! is_null($id))
    {
      //provider为EloquentUserProvider
     $user = $this->provider->retrieveByID($id);
    }
    // If the user is null, but we decrypt a "recaller" cookie we can attempt to
    // pull the user data on that cookie which serves as a remember cookie on
    // the application. Once we have a user we can return it to the caller.
    $recaller = $this->getRecaller();
    if (is_null($user) && ! is_null($recaller))
    {
      $user = $this->getUserByRecaller($recaller);
    }
    return $this->user = $user;
}

laravel 프레임워크에서 Facade 모드는 리플렉션을 사용합니다. 실제로는 app['auth']에서 메서드를 호출합니다. app['auth']는 언제 생성되었나요? AuthServiceProvider::register code> 메소드가 등록됩니다:

rrreee

그러면 마지막으로 왜 전송됩니까? 스택을 보십시오: 🎜rrreee🎜 드라이버 코드를 보십시오: 🎜rrreee🎜 getDefaultDrive 메소드 🎜rrreee🎜는 궁극적으로 구성 파일에 구성된 드라이버를 호출합니다. 🎜rrreee🎜로 구성된 경우 🎜rrreee🎜를 호출하므로 Auth:: guest는 궁극적으로 Guard::guest 메서드를 호출합니다🎜🎜여기의 논리는 먼저 세션에서 사용자 정보를 가져옵니다. 이상한 점은 세션이 사용자 ID만 저장한 다음 이를 사용한다는 것입니다. 데이터베이스에서 사용자 정보를 가져오기 위한 ID🎜rrreee

위 내용은 Laravel 프레임워크 사용자 로그인 인증의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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