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 tensorflow学习之识别单张图片的实现的示例
Feb 09 Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 Python
python3 判断列表是一个空列表的方法
May 04 Python
python 异或加密字符串的实例
Oct 14 Python
python http基本验证方法
Dec 26 Python
python3去掉string中的标点符号方法
Jan 22 Python
Python使用百度api做人脸对比的方法
Aug 28 Python
详解python uiautomator2 watcher的使用方法
Sep 09 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
matplotlib制作雷达图报错ValueError的实现
Jan 05 Python
pycharm 使用anaconda为默认环境的操作
Feb 05 Python
Python数据可视化之基于pyecharts实现的地理图表的绘制
Jun 10 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
php5 图片验证码实现代码
2009/12/11 PHP
用PHP将网址字符串转换成超链接(网址或email)
2010/05/25 PHP
CodeIgniter框架常见用法工作总结
2017/03/16 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
2017/05/29 PHP
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
javascript获取xml节点的最大值(实现代码)
2013/12/11 Javascript
浅谈JavaScript异常处理语句
2015/06/26 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
Bootstrap页面缩小变形的快速解决办法
2017/02/03 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
2017/02/22 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
[01:14:34]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第一局
2016/02/28 DOTA
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
python人人网登录应用实例
2014/09/26 Python
Python检测网站链接是否已存在
2016/04/07 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
在校生钳工实习自我鉴定
2013/09/19 职场文书
工作的心得体会
2013/12/31 职场文书
开业庆典邀请函
2014/01/08 职场文书
学生党员公开承诺书
2014/05/28 职场文书
班级团队活动方案
2014/08/14 职场文书
社会心理学学习心得体会
2016/01/22 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript