用来解析.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类的使用 实例代码讲解
Dec 28 PHP
php 读取shell管道传输过来的内容
Mar 01 PHP
PHP 使用MySQL管理Session的回调函数详解
Jun 21 PHP
使用PHP下载CSS文件中的图片的代码
Sep 24 PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 PHP
浅析THINKPHP的addAll支持的最大数据量
Feb 03 PHP
php调用自己java程序的方法详解
May 13 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
Sep 22 PHP
php实现留言板功能(会话控制)
May 23 PHP
laravel 5.4中实现无限级分类的方法示例
Jul 27 PHP
phpStudy配置多站点多域名和多端口的方法
Sep 01 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 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
linux实现php定时执行cron任务详解
2013/12/24 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
PHP中SESSION过期设置
2021/03/09 PHP
Ext 今日学习总结
2010/09/19 Javascript
JavaScript插入动态样式实现代码
2012/02/22 Javascript
jQuery动态改变图片显示大小(修改版)的实现思路及代码
2013/12/24 Javascript
jquery实现的仿天猫侧导航tab切换效果
2015/08/24 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
基于Vue单文件组件详解
2017/09/15 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
2019/10/10 Javascript
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
vc6编写python扩展的方法分享
2014/01/17 Python
Python中文件遍历的两种方法
2014/06/16 Python
Python 搭建Web站点之Web服务器网关接口
2016/11/06 Python
Python实现针对中文排序的方法
2017/05/09 Python
python利用urllib和urllib2访问http的GET/POST详解
2017/09/27 Python
一文总结学习Python的14张思维导图
2017/10/17 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
python 获取页面表格数据存放到csv中的方法
2018/12/26 Python
Python判断对象是否相等及eq函数的讲解
2019/02/25 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
解决import tensorflow as tf 出错的原因
2020/04/16 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
Python面向对象多态实现原理及代码实例
2020/09/16 Python
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
internal修饰符起什么作用
2013/12/16 面试题
教师专业理论水平的自我评价分享
2013/11/09 职场文书
挑战杯创业计划书的写作指南
2014/01/07 职场文书
校庆口号
2014/06/20 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
MySQL数据库事务的四大特性
2022/04/20 MySQL