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实现压缩与解压gzip大文件的方法
Sep 18 Python
Python中Django 后台自定义表单控件
Mar 28 Python
在pycharm中使用git版本管理以及同步github的方法
Jan 16 Python
python KNN算法实现鸢尾花数据集分类
Oct 24 Python
Scrapy框架实现的登录网站操作示例
Feb 06 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
python自动化测试三部曲之request+django实现接口测试
Oct 07 Python
python 爬虫网页登陆的简单实现
Nov 30 Python
如何用python写个模板引擎
Jan 14 Python
python实现不同数据库间数据同步功能
Feb 25 Python
pandas中DataFrame数据合并连接(merge、join、concat)
May 30 Python
关于的python五子棋的算法
May 02 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
如何去掉文章里的 html 语法
2006/10/09 PHP
PHP与SQL注入攻击[三]
2007/04/17 PHP
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
jquery 日期分离成年月日的代码
2010/05/14 Javascript
jQuery EasyUI API 中文文档 - Pagination分页
2011/09/29 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
jQuery中的$.ajax()方法应用
2014/05/06 Javascript
JavaScript设计模式之代理模式介绍
2014/12/28 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
12个非常实用的JavaScript小技巧【推荐】
2016/05/18 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
2017/03/29 Javascript
react实现换肤功能的示例代码
2018/08/14 Javascript
JavaScript碰撞检测原理及其实现代码
2020/03/12 Javascript
详解JavaScript自定义函数
2020/07/29 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
2020/08/31 Javascript
python单元测试unittest实例详解
2015/05/11 Python
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
Python连接MySQL并使用fetchall()方法过滤特殊字符
2016/03/13 Python
python中的错误处理
2016/04/10 Python
Python代码解决RenderView窗口not found问题
2016/08/28 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
澳大利亚首屈一指的在线购物目的地:Kogan.com
2017/02/02 全球购物
财务会计人员岗位职责
2013/11/30 职场文书
教师职位说明书
2014/07/29 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
警察群众路线整改措施
2014/09/26 职场文书
2015年小学体育教师工作总结
2015/10/23 职场文书
旅游安全责任协议书
2016/03/22 职场文书