用来解析.htpasswd文件的PHP类


Posted in PHP onSeptember 05, 2012

.htpasswd 文件示例:
user1:{SHA}kGPaD671VNU0OU5lqLiN/h6Q6ac=
user2:{SHA}npMqPEX3kPQTo+x/+ZckHDrIcQI=
user3:{SHA}q1Fh2LTUjjkncp11m0M9WUH5Zrw=

class Htpasswd { 
private $file = ''; 
private $salt = 'AynlJ2H.74VEfI^BZElc-Vb6G0ezE9a55-Wj'; 
private function write($pairs = array()) { 
$str = ''; 
foreach ($pairs as $username => $password) { 
$str .= "$username:{SHA}$password\n"; 
} 
file_put_contents($this -> file, $str); 
} 
private function read() { 
$pairs = array(); 
$fh = fopen($this -> file, 'r'); 
while (!feof($fh)) { 
$pair_str = str_replace("\n", '', fgets($fh)); 
$pair_array = explode(':{SHA}', $pair_str); 
if (count($pair_array) == 2) { 
$pairs[$pair_array[0]] = $pair_array[1]; 
} 
} 
return $pairs; 
} 
private function getHash($clear_password = '') { 
if (!empty($clear_password)) { 
return base64_encode(sha1($clear_password, true)); 
} else { 
return false; 
} 
} 
public function __construct($file) { 
if (file_exists($file)) { 
$this -> file = $file; 
} else { 
die($file." doesn't exist."); 
return false; 
} 
} 
public function addUser($username = '', $clear_password = '') { 
if (!empty($username) && !empty($clear_password)) { 
$all = $this -> read(); 
if (!array_key_exists($username, $all)) { 
$all[$username] = $this -> getHash($clear_password); 
$this -> write($all); 
} 
} else { 
return false; 
} 
} 
public function deleteUser($username = '') { 
$all = $this -> read(); 
if (array_key_exists($username, $all)) { 
unset($all[$username]); 
$this -> write($all); 
} else { 
return false; 
} 
} 
public function doesUserExist($username = '') { 
$all = $this -> read(); 
if (array_key_exists($username, $all)) { 
return true; 
} else { 
return false; 
} 
} 
public function getClearPassword($username) { 
return strtolower(substr(sha1($username.$this -> salt), 4, 12)); 
} 
}

使用方法
$passwdHandler = new Htpasswd('/home/myuser/.htpasswd'); 
// Add a user with name 'user1' and password 'I prefer to use passphrase rather than password.' if it doesn't exist in .htpasswd. 
$passwdHandler -> addUser('user1', 'I prefer to use passphrase rather than password.'); 
// Delete the user 'user1' if it exists in .htpasswd. 
$passwdHandler -> deleteUser('user1'); 
// Check if user 'user1' exists in .htpasswd. 
if ($passwdHandler -> doesUserExist('user1')) { 
// User 'user1' exists. 
}
PHP 相关文章推荐
用PHP实现多服务器共享SESSION数据的方法
Mar 16 PHP
PHP学习散记_编码(json_encode 中文不显示)
Nov 10 PHP
php中常用的预定义变量小结
May 09 PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
Sep 07 PHP
解析CI即CodeIgniter框架在Nginx下的重写规则
Jun 03 PHP
探讨:php中在foreach中使用foreach ($arr as &$value) 这种类型的解释
Jun 24 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
php实现把url转换迅雷thunder资源下载地址的方法
Nov 07 PHP
PHP session 会话处理函数
Jun 06 PHP
php文件上传、下载和删除示例
Aug 28 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
May 09 PHP
PHP解决高并发的优化方案实例
Dec 10 PHP
用来解析.htgroup文件的PHP类
Sep 05 #PHP
PHP curl 并发最佳实践代码分享
Sep 05 #PHP
PHP输出数组中重名的元素的几种处理方法
Sep 05 #PHP
PHP中使用crypt()实现用户身份验证的代码
Sep 05 #PHP
通过缓存数据库结果提高PHP性能的原理介绍
Sep 05 #PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
Sep 05 #PHP
php循环语句 for()与foreach()用法区别介绍
Sep 05 #PHP
You might like
php 魔术方法使用说明
2009/10/20 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
详解php反序列化
2020/06/10 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
2020/08/17 PHP
优化innerHTML操作(提高代码执行效率)
2011/08/20 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
JS HTML5 音乐天气播放器(Ajax获取天气信息)
2013/05/26 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
自己使用js/jquery写的一个定制对话框控件
2014/05/02 Javascript
Javascript刷新窗口方法小结
2015/10/21 Javascript
原生js页面滚动延迟加载图片
2015/12/20 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
2016/08/04 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
nodejs搭建本地服务器并访问文件操作示例
2019/05/11 NodeJs
寻找网站后台地址的python脚本
2014/09/01 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
Python在图片中添加文字的两种方法
2017/04/29 Python
Python基于回溯法子集树模板解决找零问题示例
2017/09/11 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
python配置文件写入过程详解
2019/10/19 Python
wxPython实现整点报时
2019/11/18 Python
python多进程并发demo实例解析
2019/12/13 Python
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
法国足球商店:Footcenter
2019/07/06 全球购物
英国知名小木屋定制网站:Tiger Sheds
2020/03/06 全球购物
介绍一下Python中webbrowser的用法
2013/05/07 面试题
医学生求职自荐书
2014/06/12 职场文书
离退休人员聘用协议书
2014/11/24 职场文书
小学少先队工作总结2015
2015/05/26 职场文书
2015年秋季运动会前导词
2015/07/20 职场文书
体育教师研修感悟
2015/11/18 职场文书
《家庭教育》读后感3篇
2019/12/18 职场文书
一些让Python代码简洁的实用技巧总结
2021/08/23 Python