Python使用htpasswd实现基本认证授权的例子


Posted in Python onJune 10, 2014

前面我讲解了如何将树莓派(Raspberry Pi)打造成无线路由,感觉每次通过命令ssh管理显麻烦,于是自己动手编写Web界面,主要是使用Python编写的CGI程序,这里用到了mini_httpd这款轻量的Web服务器,本来想装nginx的,但是想想还是精简一些吧,毕竟资源有限,况且Web管理界面仅我一个人访问。

CGI应用跑起来了,但问题来了,如何实现普通路由的那种打开页面就弹出输入用户名密码的对话框?

Python使用htpasswd实现基本认证授权的例子

这里主要用到HTTP协议的一个知识,那就是HTTP基本认证。

服务器端通过发送类似下面的头信息来实现需要认证请求:

HTTP/1.0 401 Authorization Required
WWW-Authenticate: Basic realm="Secure Area"
Content-Type: text/html

针对上述要求,于是我在CGI中采用了如下的Python代码:
def check_login():
    import base64    if "Authorization" in os.environ:
    try:
        cred = base64.b64decode(os.environ['Authorization'].split(' ')[1])
        username, password = cred.split(":")
        if db_validate_user(username, password): # 这里匹配数据库用户名密码
        return True
    except:
        pass
    print 'Status: 401 Unauthorized'
    print 'Pragma: no-cache'
    print 'Content-Type: text/html'
    print 'WWW-Authenticate: Basic realm=\"My Wireless Router\"'
    print
    print """
    <html>
    <head>
        <title>Not authenticated</title>
    </head>
    <body>
    <h1>Not authenticated.</h1>
    </body>
    </html>"""
    return False
# 调用
if not check_login():
    sys.exit(0)

但是实际操作下来后发现mini_httpd并不转发来自用户的Authorization的用户名和密码,也就是说os.environ取不到这个头信息,从而导致认证失败。

经过网上搜索后得知mini_httpd原生支持通过.htpasswd实现简单认证的技术,也就是说我们可以在需要授权访问的目录下建立.htpasswd文件实现,当然这个文件是有格式要求的,我们可以通过htpasswd命令来创建。这个命令一般Apache服务器软件会自带,不过mini_httpd也自带了,所以你可以直接使用这个命令。

#        建立文件名 账户名 密码
htpasswd -bc .htpasswd admin 123456

当一个目录下有.htpasswd文件时,mini_httpd就会弹出要求用户名和密码的对话框,输入正确后才可以浏览,如果没有这个文件则正常浏览。

因为我的cgi应用是基于Python的,所以我希望Python能够管理.htpasswd文件,幸好Python世界里有现成的库,避免了我们重复造轮子,使用easy_install的安装方式如下:

sudo easy_install htpasswd

官方文档给出的例子如下,感觉操作挺方便的,大家可以试一试:
import htpasswdwith htpasswd.Basic("/path/to/user.db") as userdb:
    try:
        userdb.add("bob", "password")
    except htpasswd.basic.UserExists, e:
        print e
    try:
        userdb.change_password("alice", "newpassword")
    except htpasswd.basic.UserNotExists, e:
        print e
with htpasswd.Group("/path/to/group.db") as groupdb:
    try:
        groupdb.add_user("bob", "admins")
    except htpasswd.group.UserAlreadyInAGroup, e:
        print e
    try:
        groupdb.delete_user("alice", "managers")
    except htpasswd.group.UserNotInAGroup, e:
        print e
Python 相关文章推荐
Python的装饰器用法学习笔记
Jun 24 Python
Python部署web开发程序的几种方法
May 05 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
Aug 05 Python
python不换行之end=与逗号的意思及用途
Nov 21 Python
python shell根据ip获取主机名代码示例
Nov 25 Python
python进阶之多线程对同一个全局变量的处理方法
Nov 09 Python
Python装饰器用法实例分析
Jan 14 Python
Django使用中间键实现csrf认证详解
Jul 22 Python
Pytorch Tensor基本数学运算详解
Dec 30 Python
matlab灰度图像调整及imadjust函数的用法详解
Feb 27 Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 Python
pytorch交叉熵损失函数的weight参数的使用
May 24 Python
python网络编程学习笔记(10):webpy框架
Jun 09 #Python
python网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 #Python
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
Jun 09 #Python
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
Jun 09 #Python
python网络编程学习笔记(六):Web客户端访问
Jun 09 #Python
python网络编程学习笔记(五):socket的一些补充
Jun 09 #Python
python网络编程学习笔记(四):域名系统
Jun 09 #Python
You might like
JAVA/JSP学习系列之六
2006/10/09 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
三种php连接access数据库方法
2013/11/11 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
php绘制一个扇形的方法
2015/01/24 PHP
phpStudy访问速度慢和启动失败的解决办法
2015/11/19 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
jQuery中remove()方法用法实例
2014/12/25 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
vue动态绑定组件子父组件多表单验证功能的实现代码
2018/05/14 Javascript
clipboard在vue中的使用的方法示例
2018/10/19 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
Python实现的石头剪子布代码分享
2014/08/22 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
解决python升级引起的pip执行错误的问题
2018/06/12 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
Python pygame绘制文字制作滚动文字过程解析
2019/12/12 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
Python while true实现爬虫定时任务
2020/06/08 Python
python绘制分布折线图的示例
2020/09/24 Python
StubHub新加坡:购买和出售全球活动门票
2017/03/10 全球购物
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
保险专业大专生求职信
2013/10/26 职场文书
英文商务邀请信
2014/01/22 职场文书
医院合作协议书
2014/08/19 职场文书
学校师德师风自我剖析材料
2014/09/29 职场文书
2014年初一班主任工作总结
2014/11/08 职场文书
比较几种Redis集群方案
2021/06/21 Redis