使用mod-python使HTTP认证可选
我有一个网页应用程序,它会根据传入的参数访问不同的控制器类。对于某些控制器,我希望用户能进行身份验证(通过简单的HTTP认证),而对于其他控制器,我希望用户可以公开访问。
有没有办法实现这个功能?在我的.htaccess文件中,我现在有:
AddHandler mod_python .py
PythonHandler handler
PythonAuthenHandler handler
PythonDebug On
AuthType Basic
AuthName "My Realm"
AuthBasicAuthoritative Off
require valid-user
身份验证处理程序被正确调用,但即使我只是这样做:
def authenhandler(req):
return apache.OK
用户还是会被要求输入密码(不过输入任何密码都能通过)。
我尝试完全去掉.htaccess中的Auth*相关内容(还有require指令),然后在那些我确实想要身份验证的情况下,直接在正常处理程序中这样做:
request.err_headers_out.add('WWW-Authenticate', 'Basic realm="My Realm")
return apache.HTTP_UNAUTHORIZED
这是我理解的,当没有收到正确的身份验证时,服务器应该怎么做。不过,这样也没有奏效。
我之前是做PHP的,我知道后者在PHP中是怎么做的——但PHP有时会做一些额外的小魔法,让这些东西真正有效。这算是其中一种情况吗?
有没有办法根据传入的URL,从同一个处理程序中选择性地请求身份验证?
1 个回答
1
在Apache中,有几种方法可以设置身份验证的范围。大多数人熟悉的是基于<Directory>的方式,也就是说,目录下的任何内容都需要通过htpasswd进行身份验证。
还有一种方式是<Location>,它适用于文件系统之外的内容,比如mod_python注册的代码。
这样,你就可以在像/status这样的“虚拟”路径上设置身份验证,前提是你已经启用了mod_status。
你也可以对mod_python路径做同样的事情。
<Location /python/app1/>
Order allow,deny
Allow from all
</Location>
<Location /python/app2/>
Order allow,deny
Allow from all
AuthType basic
AuthName "Protected Intranet Area"
AuthUserFile /etc/apache2/htpasswd
Require valid-user
</Location>
我还想补充一点——如果你说“某些用户需要用用户名和密码进行身份验证,而其他用户只需要输入用户名”,这并不一定很清楚。
或者
“某些应用程序应该始终要求身份验证,而其他应用程序则应该始终可以自由访问。”
我的第一个回答解决了最后一个问题。