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 相关文章推荐
Django自定义manage命令实例代码
Feb 11 Python
安装python时MySQLdb报错的问题描述及解决方法
Mar 20 Python
pandas.loc 选取指定列进行操作的实例
May 18 Python
关于django 数据库迁移(migrate)应该知道的一些事
May 27 Python
Python爬虫包BeautifulSoup实例(三)
Jun 17 Python
Python之使用adb shell命令启动应用的方法详解
Jan 07 Python
django最快程序开发流程详解
Jul 19 Python
对tensorflow中的strides参数使用详解
Jan 04 Python
AUC计算方法与Python实现代码
Feb 28 Python
使用keras实现孪生网络中的权值共享教程
Jun 11 Python
python接入支付宝的实例操作
Jul 20 Python
python Tornado框架的使用示例
Oct 19 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函数解决SQL injection
2006/12/09 PHP
php 图像函数大举例(非原创)
2009/06/20 PHP
php 常用算法和时间复杂度
2013/07/01 PHP
PHP中创建图像并绘制文字的例子
2014/11/19 PHP
php实现RSA加密类实例
2015/03/26 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
Laravel中间件实现原理详解
2016/10/09 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
2020/08/20 PHP
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
TextArea不支持maxlength的解决办法(jquery)
2011/09/13 Javascript
javascript当中的代码嗅探扩展原生对象和原型(prototype)
2013/01/11 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
vue-cli开发环境实现跨域请求的方法
2018/04/07 Javascript
通过封装scroll.js 获取滚动条的值
2018/07/13 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
vue全局使用axios的操作
2020/09/08 Javascript
[01:54]TI珍贵瞬间系列(三):翻盘
2020/08/28 DOTA
python实现k-means聚类算法
2018/02/23 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
Window环境下Scrapy开发环境搭建
2018/11/18 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
某科技软件测试面试题
2013/05/19 面试题
2014年最新学习全国两会精神心得
2014/03/17 职场文书
买房协议书
2014/04/11 职场文书
爱国卫生月活动总结范文
2014/04/25 职场文书
五年级下册复习计划
2015/01/19 职场文书
小平小道观后感
2015/06/09 职场文书
vue使用element-ui按需引入
2022/05/20 Vue.js