国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python使用htpasswd實現基本認證授權的例子

2019-11-25 18:22:55
字體:
來源:轉載
供稿:網友

前面我講解了如何將樹莓派(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 """
    <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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 红安县| 孝感市| 卢氏县| 顺昌县| 宜章县| 华蓥市| 南溪县| 桃园县| 汶上县| 广州市| 昌平区| 鄂伦春自治旗| 山丹县| 潢川县| 砚山县| 大埔区| 奎屯市| 四川省| 财经| 涞水县| 神木县| 安阳县| 东丰县| 雷山县| 古蔺县| 鄂托克前旗| 奈曼旗| 云安县| 哈密市| 永济市| 友谊县| 襄樊市| 乐昌市| 峡江县| 子洲县| 西青区| 钟祥市| 德阳市| 湾仔区| 张北县| 枣庄市|