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 相关文章推荐
python3使用tkinter实现ui界面简单实例
Jan 10 Python
python生成IP段的方法
Jul 07 Python
python实现文本文件合并
Dec 29 Python
Python实现线程状态监测简单示例
Mar 28 Python
浅析Python函数式编程
Oct 06 Python
对python数据切割归并算法的实例讲解
Dec 12 Python
python可视化实现KNN算法
Oct 16 Python
pycharm显示远程图片的实现
Nov 04 Python
python thrift 实现 单端口多服务的过程
Jun 08 Python
python适合做数据挖掘吗
Jun 16 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
Dec 04 Python
python邮件中附加文字、html、图片、附件实现方法
Jan 04 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
虫族 Zerg 热键控制
2020/03/14 星际争霸
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
2014/05/08 PHP
PHP实现懒加载的方法
2015/03/07 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
JavaScript isArray()函数判断对象类型的种种方法
2010/10/11 Javascript
jquery isType() 类型判断代码
2011/02/14 Javascript
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
jquery实现div阴影效果示例代码
2013/09/16 Javascript
javascript实现微信分享
2014/12/23 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
jQuery图片缩放插件smartZoom使用实例详解
2017/08/25 jQuery
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
使用Python爬取最好大学网大学排名
2018/02/24 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
python学生管理系统学习笔记
2019/03/19 Python
Django实现文件上传下载
2019/10/06 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
Python实现给PDF添加水印的方法
2021/01/25 Python
利用canvas实现图片压缩的示例代码
2018/07/17 HTML / CSS
长曲棍球装备:Lacrosse Monkey
2020/12/02 全球购物
毕业自荐书
2013/12/09 职场文书
营销总经理岗位职责
2014/02/02 职场文书
护理中职生求职信范文
2014/02/24 职场文书
《天游峰的扫路人》教学反思
2014/04/25 职场文书
公司募捐倡议书
2014/05/14 职场文书
高中学生自我评价范文
2014/09/23 职场文书
校园广播稿100字
2014/10/06 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL
前端使用svg图片改色实现示例
2022/07/23 HTML / CSS