Python使用htpasswd實(shí)現(xiàn)基本認(rèn)證授權(quán)的例子
前面我講解了如何將樹(shù)莓派(Raspberry Pi)打造成無(wú)線路由,感覺(jué)每次通過(guò)命令ssh管理顯麻煩,于是自己動(dòng)手編寫(xiě)Web界面,主要是使用Python編寫(xiě)的CGI程序,這里用到了mini_httpd這款輕量的Web服務(wù)器,本來(lái)想裝nginx的,但是想想還是精簡(jiǎn)一些吧,畢竟資源有限,況且Web管理界面僅我一個(gè)人訪問(wèn)。
CGI應(yīng)用跑起來(lái)了,但問(wèn)題來(lái)了,如何實(shí)現(xiàn)普通路由的那種打開(kāi)頁(yè)面就彈出輸入用戶名密碼的對(duì)話框?
這里主要用到HTTP協(xié)議的一個(gè)知識(shí),那就是HTTP基本認(rèn)證。
服務(wù)器端通過(guò)發(fā)送類似下面的頭信息來(lái)實(shí)現(xiàn)需要認(rèn)證請(qǐng)求:
HTTP/1.0 401 Authorization Required
WWW-Authenticate: Basic realm="Secure Area"
Content-Type: text/html
針對(duì)上述要求,于是我在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): # 這里匹配數(shù)據(jù)庫(kù)用戶名密碼
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 """
<html>
<head>
<title>Not authenticated</title>
</head>
<body>
<h1>Not authenticated.</h1>
</body>
</html>"""
return False
# 調(diào)用
if not check_login():
sys.exit(0)
但是實(shí)際操作下來(lái)后發(fā)現(xiàn)mini_httpd并不轉(zhuǎn)發(fā)來(lái)自用戶的Authorization的用戶名和密碼,也就是說(shuō)os.environ取不到這個(gè)頭信息,從而導(dǎo)致認(rèn)證失敗。
經(jīng)過(guò)網(wǎng)上搜索后得知mini_httpd原生支持通過(guò).htpasswd實(shí)現(xiàn)簡(jiǎn)單認(rèn)證的技術(shù),也就是說(shuō)我們可以在需要授權(quán)訪問(wèn)的目錄下建立.htpasswd文件實(shí)現(xiàn),當(dāng)然這個(gè)文件是有格式要求的,我們可以通過(guò)htpasswd命令來(lái)創(chuàng)建。這個(gè)命令一般Apache服務(wù)器軟件會(huì)自帶,不過(guò)mini_httpd也自帶了,所以你可以直接使用這個(gè)命令。
# 建立文件名 賬戶名 密碼
htpasswd -bc .htpasswd admin 123456
當(dāng)一個(gè)目錄下有.htpasswd文件時(shí),mini_httpd就會(huì)彈出要求用戶名和密碼的對(duì)話框,輸入正確后才可以瀏覽,如果沒(méi)有這個(gè)文件則正常瀏覽。
因?yàn)槲业腸gi應(yīng)用是基于Python的,所以我希望Python能夠管理.htpasswd文件,幸好Python世界里有現(xiàn)成的庫(kù),避免了我們重復(fù)造輪子,使用easy_install的安裝方式如下:
sudo easy_install htpasswd
官方文檔給出的例子如下,感覺(jué)操作挺方便的,大家可以試一試:
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實(shí)現(xiàn)身份證實(shí)名認(rèn)證的方法實(shí)例
- 微信小程序python用戶認(rèn)證的實(shí)現(xiàn)
- Python使用LDAP做用戶認(rèn)證的方法
- python連接mongodb密碼認(rèn)證實(shí)例
- python pycurl驗(yàn)證basic和digest認(rèn)證的方法
- python2.7+selenium2實(shí)現(xiàn)淘寶滑塊自動(dòng)認(rèn)證功能
- Python3中使用urllib的方法詳解(header,代理,超時(shí),認(rèn)證,異常處理)
- 將Python的Django框架與認(rèn)證系統(tǒng)整合的方法
- Python如何實(shí)現(xiàn)后端自定義認(rèn)證并實(shí)現(xiàn)多條件登陸
相關(guān)文章
關(guān)于numpy中矩陣的翻轉(zhuǎn)(flip)
這篇文章主要介紹了關(guān)于numpy中矩陣的翻轉(zhuǎn)(flip),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
python下載圖片實(shí)現(xiàn)方法(超簡(jiǎn)單)
下面小編就為大家?guī)?lái)一篇python下載圖片實(shí)現(xiàn)方法(超簡(jiǎn)單)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
Python中發(fā)布Web應(yīng)用的常見(jiàn)方法與對(duì)比
這篇文章主要為大家詳細(xì)介紹了Python中發(fā)布?Web?應(yīng)用的幾種常見(jiàn)方法的實(shí)現(xiàn)詳細(xì)步驟以及它們的部署方法對(duì)比,有需要的小伙伴可以參考下2025-02-02
flask-SQLALchemy連接數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例
sqlalchemy是數(shù)據(jù)庫(kù)的orm框架,讓我們操作數(shù)據(jù)庫(kù)的時(shí)候不要再用sql語(yǔ)句了,本文就介紹了flask-SQLALchemy連接數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例,感興趣的可以了解一下2022-06-06
Python新建項(xiàng)目自動(dòng)添加介紹和utf-8編碼的方法
這篇文章主要介紹了Python新建項(xiàng)目自動(dòng)添加介紹和utf-8編碼的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
python實(shí)現(xiàn)好看的時(shí)鐘效果
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)好看的時(shí)鐘效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
python通過(guò)opencv實(shí)現(xiàn)圖片裁剪原理解析
這篇文章主要介紹了python通過(guò)opencv實(shí)現(xiàn)圖片裁剪原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01

