模块

Auth_Db
继承自 Auth

数据库授权驱动

package
BootPHP/授权
author
Tinsh
copyright
© 2005-2016 Kilofox Studio

该类在 MODPATH/auth/classes/auth/db.php 第 12 行声明。

属性

protected $_config

protected static $_instance

NULL

protected $_session

方法

public auto_login( ) (在 Auth_Db 中定义)

登录一个用户,基于 COOKIE 验证自动登录

返回值

  • mixed

源代码

public function auto_login()
{
	if ($tokenCookie = Cookie::get('authautologin'))
	{
		// 加载令牌与用户
		$token = Model::factory('user_token');
		$tokenInfo = $token->loadByToken($tokenCookie);
		if ($tokenInfo->id)
		{
			if ($tokenInfo->user_agent === sha1(Request::$user_agent))
			{
				// 设置新的令牌
				Cookie::set('authautologin', $tokenInfo->token, $tokenInfo->expires - time());
				// 用找到的数据完成登录
				$user = Model::factory('User')->load($tokenInfo->user_id);
				$this->complete_login($user);
				// 自动登录成功
				return $user;
			}
			// 令牌无效
			$token->delete();
		}
	}
	return false;
}

public check_password( string $password ) (在 Auth_Db 中定义)

与原始密码(加密的)比较。只为当前(已登录)用户。

参数

  • string $password required - 密码

返回值

  • boolean

源代码

public function check_password($password)
{
	$user = $this->get_user();
	if (!$user)
		return false;
	return ($this->hash($password) === $user->password);
}

public get_user( ) (在 Auth_Db 中定义)

从 session 中取得当前登录用户(用于自动登录检查)。 如果当前没有登录用户,则返回 false。

返回值

  • mixed

源代码

public function get_user($default = NULL)
{
	$user = parent::get_user($default);
	if (!$user)
	{
		// 检查“自动登录”
		$user = $this->auto_login();
	}
	return $user;
}

public logged_in( ) (在 Auth_Db 中定义)

Checks if a session is active.

返回值

  • boolean

源代码

public function logged_in()
{
	// 从 session 中得到用户
	$user = $this->get_user();
	if ($user)
		return true;
	else
		return false;
}

public logout( [ boolean $destroy = bool false ] ) (在 Auth_Db 中定义)

退出用户,并移除所有自动登录 Cookie

参数

  • boolean $destroy = bool false - 彻底摧毁 session

返回值

  • boolean

源代码

public function logout($destroy = false)
{
	if ($tokenCookie = Cookie::get('authautologin'))
	{
		// 删除自动登录 Cookie,防止重新登录
		Cookie::delete('authautologin');
		// 从数据库中清除自动登录令牌
		$token = Model::factory('user_token');
		$tokenInfo = $token->loadByToken($tokenCookie);
		if ($tokenInfo->id)
		{
			$token->delete();
		}
	}
	return parent::logout($destroy);
}

public password( mixed $user ) (在 Auth_Db 中定义)

为用户名取得存储的密码

参数

  • mixed $user required - 用户名字符串或用户对象

返回值

  • string

源代码

public function password($user)
{
	if (!is_object($user))
	{
		$username = $user;
		// 加载用户
		$user = Model::factory('User');
		$user = $user->loadByUsername($username);
	}
	return $user->password;
}

public __construct( ) (在 Auth 中定义)

加载 Session 和配置选项

返回值

  • void

源代码

public function __construct($config = array())
{
	// 保存对象中的配置信息
	$this->_config = $config;
	$this->_session = Session::instance($this->_config['session_type']);
}

public hash( string $str ) (在 Auth 中定义)

Perform a hmac hash, using the configured method.

参数

  • string $str required - String to hash

返回值

  • string

源代码

public function hash($str)
{
	if (!$this->_config['hash_key'])
		throw new BootPHP_Exception('必须在您的授权配置中设置一个有效的 hash 键。');
	return hash_hmac($this->_config['hash_method'], $str, $this->_config['hash_key']);
}

public static instance( ) (在 Auth 中定义)

单例模式

返回值

  • Auth

源代码

public static function instance()
{
	if (!isset(self::$_instance))
	{
		// 为该类型加载配置信息
		$config = BootPHP::$config->load('auth');
		if (!$type = $config->get('driver'))
			$type = 'db';
		// 设置 session 类名
		$class = 'Auth_' . ucfirst($type);
		// 创建一个新的 session 实例
		self::$_instance = new $class($config);
	}
	return self::$_instance;
}

public login( string $username , string $password [, boolean $remember = bool false ] ) (在 Auth 中定义)

尝试登录

参数

  • string $username required - 要登录的用户名
  • string $password required - 要校验的密码
  • boolean $remember = bool false - 开启自动登录

返回值

  • boolean

源代码

public function login($username, $password, $remember = false)
{
	if (empty($password))
		return false;
	return $this->_login($username, $password, $remember);
}

protected _login( string $username , string $password , boolean $remember ) (在 Auth_Db 中定义)

登录一个用户

参数

  • string $username required - 用户名
  • string $password required - 密码
  • boolean $remember required - 开启自动登录

返回值

  • boolean

源代码

protected function _login($username, $password, $remember)
{
	$user = NULL;
	if (is_string($username))
	{
		// 加载用户信息
		if (Valid::email($username))
		{
			$user = Model::factory('User')->loadByEmail($username);
		}
		else
		{
			$user = Model::factory('User')->loadByUsername($username);
		}
	}
	if (is_string($password))
	{
		// 创建加密的密码
		$password = $this->hash($password);
	}
	// 如果密码匹配,完成登录
	if ($user && $user->password === $password)
	{
		if ($remember === true)
		{
			$time = time();
			// Token 数据
			$create = new stdClass();
			$create->user_id = $user->id;
			$create->created = $time;
			$create->expires = $time + $this->_config['lifetime'];
			$create->user_agent = sha1(Request::$user_agent);
			// 创建一个新的自动登录令牌
			$token = Model::factory('user_token');
			$token = $token->create($create);
			// 设置自动登录 Cookie
			Cookie::set('authautologin', $token->token, $this->_config['lifetime']);
		}
		// 完成登录
		$this->complete_login($user);
		return true;
	}
	// 登录失败
	return false;
}

protected complete_login( object $user ) (在 Auth_Db 中定义)

完成用户登录,增加登录次数,并设置 Session 数据

参数

  • object $user required - 用户

返回值

  • void

源代码

protected function complete_login($user)
{
	// 保存用户
	Model::factory('User')->updateLogin($user->id);
	return parent::complete_login($user);
}