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的Django框架中从url中捕捉文本的方法
Jul 20 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
Jan 20 Python
pycharm中连接mysql数据库的步骤详解
May 02 Python
通过Python 获取Android设备信息的轻量级框架
Dec 18 Python
python多维数组切片方法
Apr 13 Python
Python Grid使用和布局详解
Jun 30 Python
解决pycharm无法识别本地site-packages的问题
Oct 13 Python
python+opencv像素的加减和加权操作的实现
Jul 14 Python
python实现两个文件夹的同步
Aug 29 Python
Python实现word2Vec model过程解析
Dec 16 Python
django数据模型(Model)的字段类型解析
Dec 25 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
Feb 29 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
Syphon 虹吸式咖啡壶冲煮–拨动法
2021/03/03 冲泡冲煮
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
10条PHP高级技巧[修正版]
2011/08/02 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
2014/04/10 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
2018/05/21 PHP
读jQuery之四(优雅的迭代)
2011/06/20 Javascript
javascript学习笔记(三) String 字符串类型介绍
2012/06/19 Javascript
深入理解JavaScript 闭包究竟是什么
2013/04/12 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
JS中三目运算符和if else的区别分析与示例
2014/11/21 Javascript
javascript实现数独解法
2015/03/14 Javascript
jQuery检测返回值的数据类型
2015/07/13 Javascript
jquery结婚电子请柬特效源码分享
2015/08/21 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
vue toggle做一个点击切换class(实例讲解)
2018/03/13 Javascript
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
python显示生日是星期几的方法
2015/05/27 Python
python绘制地震散点图
2019/06/18 Python
简单了解python shutil模块原理及使用方法
2020/04/28 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
Kingsoft金山公司C/C++笔试题
2016/05/10 面试题
高中物理教学反思
2014/02/08 职场文书
简历中个人自我评价分享
2014/03/15 职场文书
感恩父母的演讲稿
2014/05/06 职场文书
财政局个人年终总结
2015/03/03 职场文书
致运动员的广播稿
2015/08/19 职场文书
《法国号》教学反思
2016/02/22 职场文书
分析Netty直接内存原理及应用
2021/06/14 Java/Android