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中的列表知识点汇总
Apr 14 Python
Linux下使用python自动修改本机网关代码分享
May 21 Python
浅谈Python2获取中文文件名的编码问题
Jan 09 Python
python十进制和二进制的转换方法(含浮点数)
Jul 07 Python
Django进阶之CSRF的解决
Aug 01 Python
python list转矩阵的实例讲解
Aug 04 Python
python numpy 常用随机数的产生方法的实现
Aug 21 Python
Python 爬虫实现增加播客访问量的方法实现
Oct 31 Python
python图形开发GUI库pyqt5的基本使用方法详解
Feb 14 Python
django中url映射规则和服务端响应顺序的实现
Apr 02 Python
Python填充任意颜色,不同算法时间差异分析说明
May 16 Python
matplotlib交互式数据光标mpldatacursor的实现
Feb 03 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
phpMyAdmin下载、安装和使用入门教程
2007/05/31 PHP
php上传文件,创建递归目录的实例代码
2013/10/18 PHP
PHP中获取时间的下一周下个月的方法
2014/03/18 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
微信开发之php表单微信中自动提交两次问题解决办法
2017/01/08 PHP
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
jquery操作select大全
2014/04/25 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
2014/12/18 Javascript
jQuery实现div横向拖拽排序的简单实例
2016/07/13 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
如何手动实现es5中的bind方法详解
2018/12/07 Javascript
vue+eslint+vscode配置教程
2019/08/09 Javascript
JS计算斐波拉切代码实例
2019/09/12 Javascript
python根据路径导入模块的方法
2014/09/30 Python
Python内置函数dir详解
2015/04/14 Python
使用python实现rsa算法代码
2016/02/17 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
python字符串反转的四种方法详解
2019/12/02 Python
Origins加拿大官网:雅诗兰黛集团高端植物护肤品牌
2017/11/19 全球购物
小学教师管理制度
2014/01/18 职场文书
庆七一活动方案
2014/01/25 职场文书
调解协议书
2014/04/16 职场文书
贷款承诺书范文
2014/05/19 职场文书
公共场所禁烟标语
2014/06/25 职场文书
公司市场专员岗位职责
2014/06/29 职场文书
总经理助理岗位职责范本
2014/07/20 职场文书
先进员工获奖感言
2014/08/14 职场文书
电话营销开场白
2015/05/29 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
Anaconda配置各版本Pytorch的实现
2021/08/07 Python
Python读写yaml文件
2022/03/20 Python