用来解析.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 相关文章推荐
fleaphp下不确定的多条件查询的巧妙解决方法
Sep 11 PHP
深入理解PHP原理之Session Gc的一个小概率Notice
Apr 12 PHP
PHP学习笔记 (1) 环境配置与代码调试
Jun 19 PHP
PHP学习笔记 IIS7下安装配置php环境
Oct 29 PHP
浅谈PHP解析URL函数parse_url和parse_str
Nov 11 PHP
Symfony生成二维码的方法
Feb 04 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
Mar 07 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
thinkphp的dump函数无输出实例代码
Nov 15 PHP
Zend Framework动作控制器用法示例
Dec 09 PHP
浅谈PHP表单提交(POST&GET&URL编/解码)
Apr 03 PHP
PHP设计模式之委托模式定义与用法简单示例
Aug 13 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中判断变量为空的几种方法分享
2013/08/26 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
php+Ajax处理xml与json格式数据的方法示例
2019/03/04 PHP
PHP基于面向对象封装的分页类示例
2019/03/15 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
jquery append()方法与html()方法的区别及使用介绍
2014/08/01 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
2014/10/22 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
2015/03/18 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
2016/08/31 Javascript
vuejs指令详解
2017/02/07 Javascript
利用vue + koa2 + mockjs模拟数据的方法教程
2017/11/22 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
微信小程序swiper禁止用户手动滑动代码实例
2019/08/23 Javascript
[49:15]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第二场 1月19日
2021/03/11 DOTA
盘点提高 Python 代码效率的方法
2014/07/03 Python
Python人脸识别第三方库face_recognition接口说明文档
2019/05/03 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
Python实现TCP通信的示例代码
2019/09/09 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
Python生成器generator原理及用法解析
2020/07/20 Python
Python运算符+与+=的方法实例
2021/02/18 Python
加拿大快时尚零售商:Ardene
2018/02/14 全球购物
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
英国复古服装和球衣购买网站:3Retro Football
2018/07/09 全球购物
香港彩色隐形眼镜在线商店:Stunninglens(全球免费送货)
2019/05/10 全球购物
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
品牌宣传方案
2014/03/21 职场文书
值班管理制度范本
2015/08/06 职场文书
Win10鼠标轨迹怎么开 Win10显示鼠标轨迹方法
2022/04/06 数码科技
vue动态绑定style样式
2022/04/20 Vue.js