用来解析.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配置心得包含MYSQL5乱码解决
Nov 20 PHP
php下删除一篇文章生成的多个静态页面
Aug 08 PHP
php自定义函数之递归删除文件及目录
Aug 08 PHP
PHP图片库imagemagick安装方法
Sep 23 PHP
php实现的mongodb操作类
May 28 PHP
PHP缓冲区用法总结
Feb 14 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
Jan 16 PHP
PHP观察者模式定义与用法实例分析
Mar 22 PHP
php解压缩zip和rar压缩包文件的方法
Jul 10 PHP
php伪静态验证码不显示的解决方案
Sep 26 PHP
php 使用expat方式解析xml文件操作示例
Nov 26 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 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
星际争霸任务指南——人族
2020/03/04 星际争霸
PHP 地址栏信息的获取代码
2009/01/07 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
不懂JavaScript应该怎样学
2008/04/16 Javascript
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
javascript动态加载三
2012/08/22 Javascript
JS远程获取网页源代码实例
2013/09/05 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
table insertRow、deleteRow定义和用法总结
2014/05/14 Javascript
JS模拟键盘打字效果的方法
2015/08/05 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
简述vue路由打开一个新的窗口的方法
2018/11/29 Javascript
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
vue npm install 安装某个指定的版本操作
2020/08/11 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
2020/10/14 Javascript
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
Python3单行定义多个变量或赋值方法
2018/07/12 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
python实现输入的数据在地图上生成热力图效果
2019/12/06 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
django从后台返回html代码的实例
2020/03/11 Python
Django项目uwsgi+Nginx保姆级部署教程实现
2020/04/19 Python
浅析Python 责任链设计模式
2020/09/11 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
2021/01/24 Python
美国领先的低折扣旅行网站:Hotwire
2019/01/19 全球购物
学生个人求职自荐信格式
2013/09/23 职场文书
服务理念标语
2014/06/18 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
毕业生党员个人总结
2015/02/14 职场文书
工作自我推荐信范文
2015/03/25 职场文书
小学班级标语口号大全
2015/12/26 职场文书
Golang并发操作中常见的读写锁详析
2021/08/30 Golang