Python使用htpasswd实现基本认证授权的例子

时间:2022-05-07 06:43:17 

前面我讲解了如何将树莓派(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 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

标签:Python,基本认证授权
0
投稿

猜你喜欢

  • 基于python纯函数实现井字棋游戏

    2023-02-12 09:16:06
  • SQL子查询全接触

    2007-08-20 10:51:00
  • Golang如何读取单行超长的文本详解

    2024-05-10 13:57:21
  • [MySQL binlog]mysql如何彻底解析Mixed日志格式的binlog

    2024-01-16 23:34:05
  • 40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三

    2024-04-22 22:20:09
  • Python中getattr函数和hasattr函数作用详解

    2022-10-29 15:42:11
  • ASP无组件汉字验证码

    2008-05-08 13:19:00
  • Python 错误和异常代码详解

    2022-02-12 15:14:08
  • 教你解决往mysql数据库中存入汉字报错的方法

    2024-01-15 02:32:06
  • 一文教你如何快速学会Go的struct数据类型

    2024-02-14 22:58:44
  • flask框架自定义过滤器示例【markdown文件读取和展示功能】

    2023-03-07 19:22:27
  • pytorch 网络参数 weight bias 初始化详解

    2023-08-12 07:43:57
  • PHP连接和操作MySQL数据库基础教程

    2023-11-20 22:41:47
  • Web2.0 的视觉设计

    2007-10-24 20:12:00
  • mysql8.0.23 msi安装超详细教程

    2024-01-22 13:44:14
  • Django高级编程之自定义Field实现多语言

    2022-04-30 23:52:36
  • 最简洁的asp多重查询的解决方案

    2011-04-15 10:50:00
  • Windows10下mysql 8.0.19 安装配置方法图文教程

    2024-01-21 06:33:27
  • BootStrap创建响应式导航条实例代码

    2023-08-09 02:09:55
  • Python教程之基本运算符的使用(上)

    2023-12-16 23:11:40
  • asp之家 网络编程 m.aspxhome.com