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中endswith()函数的基本使用
Apr 07 Python
Python爬虫天气预报实例详解(小白入门)
Jan 24 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
May 21 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
PyQt5固定窗口大小的方法
Jun 18 Python
python爬虫 线程池创建并获取文件代码实例
Sep 28 Python
python pycharm的安装及其使用
Oct 11 Python
Python银行系统实战源码
Oct 25 Python
对Python中 \r, \n, \r\n的彻底理解
Mar 06 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
Jun 10 Python
Python提取视频中图片的示例(按帧、按秒)
Oct 22 Python
Python必备技巧之函数的使用详解
Apr 04 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
Mysql和网页显示乱码解决方法集锦
2008/03/27 PHP
将时间以距今多久的形式表示,PHP,js双版本
2012/09/25 PHP
Yii学习总结之安装配置
2015/02/22 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
ArrayList类(增强版)
2007/04/04 Javascript
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
2011/07/11 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
2013/04/07 Javascript
JS实现时间格式化的方式汇总
2013/10/16 Javascript
jQuery实现公告文字左右滚动的实例代码
2013/10/29 Javascript
javascript实现复制与粘贴操作实例
2014/10/16 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
2020/12/01 Javascript
JS多物体实现缓冲运动效果示例
2016/12/20 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
详谈javascript精度问题与调整
2017/07/08 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
详解几十行代码实现一个vue的状态管理
2019/01/28 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
2019/05/20 Javascript
基于layui内置模块(element常用元素的操作)
2019/09/20 Javascript
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
python矩阵转换为一维数组的实例
2018/06/05 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
wxPython:python首选的GUI库实例分享
2019/10/05 Python
Python本地及虚拟解释器配置过程解析
2020/10/13 Python
如何启动时不需输入用户名与密码
2014/05/09 面试题
Linux中如何用命令创建目录
2016/12/02 面试题
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
文秘人员工作职责
2014/01/31 职场文书
2016年教师节感言
2015/12/09 职场文书
css3 文字断裂效果
2022/04/22 HTML / CSS