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 转换 Javascript %u 字符串为python unicode的代码
Sep 06 Python
python实现按任意键继续执行程序
Dec 30 Python
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
Python os.rename() 重命名目录和文件的示例
Oct 25 Python
Python中模块(Module)和包(Package)的区别详解
Aug 07 Python
阿里云ECS服务器部署django的方法
Aug 29 Python
PyCharm如何导入python项目的方法
Feb 06 Python
python 伯努利分布详解
Feb 25 Python
django 链接多个数据库 并使用原生sql实现
Mar 28 Python
Python使用matplotlib绘制圆形代码实例
May 27 Python
使用pytorch实现论文中的unet网络
Jun 24 Python
使用BeautifulSoup4解析XML的方法小结
Dec 07 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
怎样才能成为PHP高手?学会“懒惰”的编程
2006/12/05 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
js前台分页显示后端JAVA数据响应
2013/03/18 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
AJAX和jQuery动态加载数据的实现方法
2016/12/05 Javascript
浅谈Vue.js
2017/03/02 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
vue生命周期与钩子函数简单示例
2019/03/13 Javascript
JSX在render函数中的应用详解
2019/09/04 Javascript
基于js实现逐步显示文字输出代码实例
2020/04/02 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
2020/08/20 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
[01:21:58]守擂赛DOTA2第一周决赛
2020/04/22 DOTA
用python处理MS Word的实例讲解
2018/05/08 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
Python 文本文件内容批量抽取实例
2018/12/10 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
使用Python实现画一个中国地图
2019/11/23 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
python带参数打包exe及调用方式
2019/12/21 Python
jupyter notebook实现显示行号
2020/04/13 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
美国演唱会订票网站:Ticketmaster美国
2017/10/05 全球购物
销售口号大全
2014/06/11 职场文书
具结保证书
2015/01/17 职场文书
教师个人发展总结
2015/02/11 职场文书
大一学生个人总结
2015/02/15 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
找规律教学反思
2016/02/23 职场文书
Django如何与Ajax交互
2021/04/29 Python
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python
浅谈克隆 JavaScript
2021/11/02 Javascript