1

我有一个 Web 应用程序,它根据传递的参数访问多个控制器类。对于某些控制器,我希望用户进行身份验证(通过简单的 HTTP 身份验证),而对于某些控制器,我希望进行公共访问。

有没有办法做到这一点?在我的 .htaccess 文件中,我现在有

AddHandler mod_python .py
PythonHandler handler
PythonAuthenHandler handler
PythonDebug On

AuthType Basic
AuthName "My Realm"
AuthBasicAuthoritative Off
require valid-user

authenhandler 被正确调用,但即使我只是这样做

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 从同一个处理程序选择性地请求身份验证?

4

1 回答 1

1

有几种方法可以使用 Apache 指定身份验证范围,大多数人习惯使用的方法是 gt;Directorylt; 基于 - 即目录中或目录下的任何内容都通过 htpasswd 进行身份验证。

还有 gt;Locationlt;,它将指令应用于文件系统之外的内容,例如 mod_python 注册代码。

如果您启用了 mod_status,这就是您可以在/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>

我应该补充一下 - 如果您的意思是“某些用户应该使用用户名和密码进行身份验证,而其他用户应该只需要输入用户名”,则不一定清楚

或者

“某些应用程序应该 100% 的时间要求身份验证,而其他应用程序应该 100% 的时间免费提供”

我的第一个答案整理了最后一个查询。

于 2011-05-27T09:46:44.240 回答