php登陆认证框架,Laravel框架用户登陆身份验证实现方法详解

本文实例讲述了Laravel框架用户登陆身份验证实现方法。分享给大家供大家参考,具体如下:

laravel中检测用户是否登录,有以下的代码:

if ( !Auth::guest() )

{

return Redirect::to('/dashboard');

}

那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方法

这里的逻辑先从session中取用户信息,奇怪的是session里只保存的是用户ID,然后拿这个ID来从数据库中取用户信息

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框架的PHP程序设计有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值