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装饰器使用的一些建议
Jun 03 Python
以windows service方式运行Python程序的方法
Jun 03 Python
使用简单工厂模式来进行Python的设计模式编程
Mar 01 Python
windows下python之mysqldb模块安装方法
Sep 07 Python
python thrift搭建服务端和客户端测试程序
Jan 17 Python
Python实现购物车购物小程序
Apr 18 Python
浅谈Django中view对数据库的调用方法
Jul 18 Python
Python3使用PySynth制作音乐的方法
Sep 09 Python
Tensorflow实现在训练好的模型上进行测试
Jan 20 Python
django rest framework使用django-filter用法
Jul 15 Python
Python Matplotlib绘图基础知识代码解析
Aug 31 Python
python实现过滤敏感词
May 08 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
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
javascript实现校验文件上传控件实例
2015/04/20 Javascript
js带点自动图片轮播幻灯片特效代码分享
2015/09/07 Javascript
Nodejs从有门道无门菜鸟起飞必看教程
2016/07/20 NodeJs
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
Node+Express+MongoDB实现登录注册功能实例
2017/04/23 Javascript
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
JavaScript中的相等操作符使用详解
2019/12/21 Javascript
vue实现标签云效果的示例
2020/11/09 Javascript
JS指定音频audio在某个时间点进行播放
2020/11/28 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
[09:47]2018DOTA2亚洲邀请赛4.5SOLO赛 No[o]ne vs Sumail
2018/04/06 DOTA
python检测IP地址变化并触发事件
2018/12/26 Python
Python 内置函数globals()和locals()对比详解
2019/12/23 Python
如何基于Python和Flask编写Prometheus监控
2020/11/25 Python
CSS3中box-shadow的用法介绍
2015/07/15 HTML / CSS
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
META-INF文件夹中的MANIFEST.MF的作用
2016/06/21 面试题
品学兼优的大学生自我评价
2013/09/20 职场文书
班会关于环保演讲稿
2013/12/29 职场文书
茶叶店创业计划书范文
2014/01/19 职场文书
房地产促销活动方案
2014/03/01 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书
新手初学Java List 接口
2021/07/07 Java/Android
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL
MySQL详解进行JDBC编程与增删改查方法
2022/06/16 MySQL