Python使用htpasswd实现基本认证授权的例子
admin
2023-07-31 02:05:55
0

前面我讲解了如何将树莓派(Raspberry Pi)打造成无线路由,感觉每次通过命令ssh管理显麻烦,于是自己动手编写Web界面,主要是使用Python编写的CGI程序,这里用到了mini_httpd这款轻量的Web服务器,本来想装nginx的,但是想想还是精简一些吧,毕竟资源有限,况且Web管理界面仅我一个人访问。

CGI应用跑起来了,但问题来了,如何实现普通路由的那种打开页面就弹出输入用户名密码的对话框?

这里主要用到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 \”\”\”
   
   
        Not authenticated
   
   
   

Not authenticated.


   
    \”\”\”
    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 htpasswd

with 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

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...