源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-02-16 02:48 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Python使用htpasswd实现基本认证授权的例子
前面我讲解了如何将树莓派(Raspberry Pi)打造成无线路由,感觉每次通过命令ssh管理显麻烦,于是自己动手编写Web界面,主要是使用Python编写的CGI程序,这里用到了mini_httpd这款轻量的Web服务器,本来想装nginx的,但是想想还是精简一些吧,毕竟资源有限,况且Web管理界面仅我一个人访问。 CGI应用跑起来了,但问题来了,如何实现普通路由的那种打开页面就弹出输入用户名密码的对话框? [img]http://files.jb51.net/file_images/article/201406/201461093303188.png?201451093315[/img] 这里主要用到HTTP协议的一个知识,那就是HTTP基本认证。 服务器端通过发送类似下面的头信息来实现需要认证请求:
[u]复制代码[/u] 代码如下:
HTTP/1.0 401 Authorization Required WWW-Authenticate: Basic realm="Secure Area" Content-Type: text/html
针对上述要求,于是我在CGI中采用了如下的Python代码:
[u]复制代码[/u] 代码如下:
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也自带了,所以你可以直接使用这个命令。
[u]复制代码[/u] 代码如下:
#        建立文件名 账户名 密码 htpasswd -bc .htpasswd admin 123456
当一个目录下有.htpasswd文件时,mini_httpd就会弹出要求用户名和密码的对话框,输入正确后才可以浏览,如果没有这个文件则正常浏览。 因为我的cgi应用是基于Python的,所以我希望Python能够管理.htpasswd文件,幸好Python世界里有现成的库,避免了我们重复造轮子,使用easy_install的安装方式如下:
[u]复制代码[/u] 代码如下:
sudo easy_install htpasswd
官方文档给出的例子如下,感觉操作挺方便的,大家可以试一试:
[u]复制代码[/u] 代码如下:
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
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部