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自动化测试之setUp与tearDown实例
Sep 28 Python
Python基于PyGraphics包实现图片截取功能的方法
Dec 21 Python
python 3调用百度OCR API实现剪贴板文字识别
Sep 04 Python
用Python爬取QQ音乐评论并制成词云图的实例
Aug 24 Python
python 数据提取及拆分的实现代码
Aug 26 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
Dec 19 Python
python操作gitlab API过程解析
Dec 27 Python
基于python实现地址和经纬度转换
May 19 Python
Python实现ElGamal加密算法的示例代码
Jun 19 Python
详解python datetime模块
Aug 17 Python
浅谈Python __init__.py的作用
Oct 28 Python
Python中的 No Module named ***问题及解决
Jul 23 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
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
PHP使用Redis实现防止大并发下二次写入的方法
2017/10/09 PHP
js 解决“options为空或不是对象”
2008/12/22 Javascript
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
JS实现div内部的文字或图片自动循环滚动代码
2013/04/19 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
Javascript中this关键字的一些小知识
2015/03/15 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
2016/06/12 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
AngularJS包括详解及示例代码
2016/08/17 Javascript
深究AngularJS中$sce的使用
2017/06/12 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
小程序指纹验证的实现代码
2018/12/04 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
Vue是怎么渲染template内的标签内容的
2020/06/05 Javascript
详解node.js 事件循环
2020/07/22 Javascript
Python fileinput模块使用介绍
2014/11/30 Python
python创建临时文件夹的方法
2015/07/06 Python
详解TensorFlow查看ckpt中变量的几种方法
2018/06/19 Python
解决Python print 输出文本显示 gbk 编码错误问题
2018/07/13 Python
详解Python进阶之切片的误区与高级用法
2018/12/24 Python
python 实现UTC时间加减的方法
2018/12/31 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
2019/05/10 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
Django用数据库表反向生成models类知识点详解
2020/03/25 Python
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
军校大学生个人的自我评价
2014/02/17 职场文书
Docker部署Mysql8的实现步骤
2022/07/07 Servers