之前使用过WWW-Authenticate验证的方式做过用户验证的相关功能,但仅限于个人使用后台,简单应用。在一个公司后台项目中,使用了WWW-Authenticate的验证方式,发现在退出的时候遇到些问题。

不能简单的更改 $_SERVER['PHP_AUTH_USER']$_SERVER['PHP_AUTH_PW'] 变量。查了下线上的手册,根据网友的评论,找到了一种解决方案,是借助于 $_COOKIE 来实现的,分享这个class给大家。

class UserIdentity
{
	public function authenticate($desc = '', $cancel_info = '')
	{
		if (empty($_COOKIE['auth'])) {
			$_SERVER['PHP_AUTH_USER'] = '';
			$_SERVER['PHP_AUTH_PW'] = ''; 
		}

		if (!$this->isVaild()) {
			setcookie("auth", $_COOKIE['auth'] = 1);
			self::doAuth($desc, $cancel_info);
		}
	}

	public function logout()
	{
		setcookie("auth", $_COOKIE['auth'] = 0);
	}

	protected function isVaild()
	{
		if (empty($_SERVER['PHP_AUTH_USER']) || empty($_SERVER['PHP_AUTH_PW'])) {
			return false;
		}
		// 拿到 PHP_AUTH_USER PHP_AUTH_PW
		// 验证逻辑处理
		return true;
	}

	protected static function doAuth($desc, $cancel_info)
	{
		header('WWW-Authenticate: Basic realm="' . $desc . '"');
		header('HTTP/1.0 401 Unauthorized');
		header("Content-type: text/html; charset=utf-8");
		echo $cancel_info;
		exit;
	}
}

具体使用:

// 登录检查
// $user = new UserIdentity();
// user->authenticate('Input you user name and password', '您必须登录才能使用该功能');
// 退出
// $user->logout();

希望能给遇到同样问题的朋友帮助。