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中使用动态变量名的方法
May 06 Python
跟老齐学Python之不要红头文件(2)
Sep 28 Python
Python的Flask框架中配置多个子域名的方法讲解
Jun 07 Python
Python引用传值概念与用法实例小结
Oct 07 Python
Python之web模板应用
Dec 26 Python
Python Dataframe 指定多列去重、求差集的方法
Jul 10 Python
详解python的sorted函数对字典按key排序和按value排序
Aug 10 Python
对python中字典keys,values,items的使用详解
Feb 03 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 Python
Python 3.6打包成EXE可执行程序的实现
Oct 18 Python
全网首秀之Pycharm十大实用技巧(推荐)
Apr 27 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 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
Zerg兵种介绍
2020/03/14 星际争霸
php简单静态页生成过程
2008/03/27 PHP
探讨如何在php168_cms中提取验证码
2013/06/08 PHP
php计算数组不为空元素个数的方法
2014/01/27 PHP
Parse正式发布开源PHP SDK
2014/08/11 PHP
DEFER怎么用?
2006/07/01 Javascript
javascript多种数据类型表格排序代码分析
2010/09/11 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
2013/06/12 Javascript
js 表单提交后按钮变灰的实例代码
2013/08/16 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
jquery代码实现多选、不同分享功能
2015/07/31 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
分享jQuery网页元素拖拽插件
2020/12/01 Javascript
jQuery的deferred对象使用详解
2016/09/25 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
详解微信小程序获取当前时间及日期的方法
2019/04/28 Javascript
JS中的算法与数据结构之集合(Set)实例详解
2019/08/20 Javascript
JS控制只能输入数字并且最多允许小数点两位
2019/11/24 Javascript
js判断密码强度的方法
2020/03/18 Javascript
[03:10]2014DOTA2 TI马来劲旅Titan首战告捷目标只是8强
2014/07/10 DOTA
Python 实现Windows开机运行某软件的方法
2018/10/14 Python
余弦相似性计算及python代码实现过程解析
2019/09/18 Python
pandas数据处理之绘图的实现
2020/06/15 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
草莓网美国官网:Strawberrynet USA
2016/12/11 全球购物
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
无工作经验者个人求职信范文
2013/12/22 职场文书
2014年计算机专业个人自我评价
2014/01/19 职场文书
办理房产过户的委托书
2014/09/14 职场文书
门市房租房协议书
2014/12/04 职场文书
员工评语范文
2014/12/31 职场文书
2016党员读书思廉心得体会
2016/01/23 职场文书
八年级英语教学反思
2016/02/15 职场文书