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编码时应该注意的几个情况
Mar 04 Python
python通过ElementTree操作XML获取结点读取属性美化XML
Dec 02 Python
跟老齐学Python之复习if语句
Oct 02 Python
python实现复制整个目录的方法
May 12 Python
Django查找网站项目根目录和对正则表达式的支持
Jul 15 Python
教你用Python写安卓游戏外挂
Jan 11 Python
VSCode下好用的Python插件及配置
Apr 06 Python
Pandas中把dataframe转成array的方法
Apr 13 Python
使用PyInstaller将python转成可执行文件exe笔记
May 26 Python
Python输出\u编码将其转换成中文的实例
Dec 15 Python
Python 元组拆包示例(Tuple Unpacking)
Dec 24 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
Jan 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
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
Ajax PHP分页演示
2007/01/02 PHP
PHP字符转义相关函数小结(php下的转义字符串)
2007/04/12 PHP
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
3款值得推荐的微信开发开源框架
2014/10/28 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
2014/06/23 Javascript
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
js实现鼠标单击Tab表单切换效果
2018/05/16 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
在vue项目中 实现定义全局变量 全局函数操作
2020/10/26 Javascript
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
python实现ID3决策树算法
2017/12/20 Python
Python科学计算包numpy用法实例详解
2018/02/08 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
浅谈python3发送post请求参数为空的情况
2018/12/28 Python
详解python环境安装selenium和手动下载安装selenium的方法
2020/03/17 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
如何理解python中数字列表
2020/05/29 Python
浅析Python 序列化与反序列化
2020/08/05 Python
关于是否需要写商业计划书
2014/02/07 职场文书
大宝sod蜜广告词
2014/03/21 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
安全宣传标语
2014/06/10 职场文书
快递员岗位职责
2014/09/12 职场文书
违反工作规定检讨书范文
2014/12/14 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
雷锋的故事观后感
2015/06/10 职场文书
食堂卫生管理制度
2015/08/04 职场文书
我的中国梦主题班会
2015/08/14 职场文书
关于的python五子棋的算法
2022/05/02 Python
从原生JavaScript到React深入理解
2022/07/23 Javascript