之前使用过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();
希望能给遇到同样问题的朋友帮助。