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 多进程通信模块的简单实现
Feb 20 Python
详解Python中的条件判断语句
May 14 Python
让python 3支持mysqldb的解决方法
Feb 14 Python
Python 对输入的数字进行排序的方法
Jun 23 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
python/sympy求解矩阵方程的方法
Nov 08 Python
Python学习笔记之视频人脸检测识别实例教程
Mar 06 Python
基于Python的PIL库学习详解
May 10 Python
Tensorflow设置显存自适应,显存比例的操作
Feb 03 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
Feb 07 Python
Python 实现日志同时输出到屏幕和文件
Feb 19 Python
python中数组和列表的简单实例
Mar 25 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
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
PHP 正则表达式小结
2015/02/12 PHP
简单谈谈favicon
2015/06/10 PHP
js原生态函数中使用jQuery中的 $(this)无效的解决方法
2011/05/25 Javascript
jQuery动画animate方法使用介绍
2013/05/06 Javascript
基于javascript滚动图片具体实现
2013/11/18 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
javascript验证身份证号
2015/03/03 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
ECMAScript6快速入手攻略
2016/07/18 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
webpack 插件html-webpack-plugin的具体使用
2018/04/09 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
微信小程序 可搜索的地址选择实现详解
2019/08/28 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
[06:53]DOTA2每周TOP10 精彩击杀集锦vol.3
2014/06/25 DOTA
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
使用Python3制作TCP端口扫描器
2017/04/17 Python
Django添加sitemap的方法示例
2018/08/06 Python
Python 调用 zabbix api的方法示例
2019/01/06 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
python压包的概念及实例详解
2021/02/17 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
儿科护理实习自我鉴定
2013/09/19 职场文书
酒店优秀员工事迹材料
2014/06/02 职场文书
世博会口号
2014/06/20 职场文书
2015年幼儿园中班下学期工作总结
2015/05/22 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python