【发布时间】:2010-10-16 13:47:36
【问题描述】:
我想让用户使用 Apache 访问 WebDav,但我想先对他们进行身份验证,然后让每个用户访问特定文件夹。所有身份验证都必须针对基于 Django 的数据库进行。我可以让 Django 身份验证自己工作,但我需要帮助我对每个用户进行身份验证并为他们提供专用的 webdav 用户特定区域。
有什么提示吗?
【问题讨论】:
标签: python django apache webdav
我想让用户使用 Apache 访问 WebDav,但我想先对他们进行身份验证,然后让每个用户访问特定文件夹。所有身份验证都必须针对基于 Django 的数据库进行。我可以让 Django 身份验证自己工作,但我需要帮助我对每个用户进行身份验证并为他们提供专用的 webdav 用户特定区域。
有什么提示吗?
【问题讨论】:
标签: python django apache webdav
首先,对于其他读者,我使用WSGI authentication script 对 Django 进行了身份验证。
然后,问题的核心是,给每个 Django 用户,在这种情况下,他们自己的 WebDav 目录与其他用户分开。假设 Apache 虚拟站点配置中的以下 WebDAV 设置(通常在 /etc/apache2/sites-enabled/ 中)
<Directory /webdav/root/on/server>
DAV On
# No .htaccess allowed
AllowOverride None
Options Indexes
AuthType Basic
AuthName "Login to your webdav area"
Require valid-user
AuthBasicProvider wsgi
WSGIAuthUserScript /where/is/the/authentication-script.wsgi
</Directory>
请注意尚未设置 WebDav 的公共地址。这个和用户区的东西,在同一个配置文件的两行中固定(把这些放在结束子句之后):
RewriteEngine On
RewriteRule ^/webdav-url/(.*?)$ /webdav/root/on/server/%{LA-U:REMOTE_USER}/$1
现在,通过http://my-server.com/webdav-url/ 访问 webdav 用户收到登录提示,然后将进入 webdav 根目录的子目录,其名称与其用户名相同。 LA-U: 让 Apache “向前看”,让用户在确定安装路径之前登录,这很关键,因为该路径取决于用户名。如果没有一些重写规则,就没有 URL,用户也不会得到登录提示。换句话说,LA-U 避免了这种登录处理的 catch-22。
注意事项:需要启用mod_rewrite,并且用户名必须作为目录名有效,无需任何修改。此外,这些命令不会自动创建用户目录,因此必须通过其他方式确保它们的存在。
【讨论】:
您可能会发现 apache mod_authn_dbd 模块可以满足您的需求。该模块让 apache 检查 SQL 数据库的身份验证和授权。您可以在您要保护的<Location>、<Directory> (etc) 区域中使用此指令:
<Directory /usr/www/myhost/private>
# other config ere
# mod_authn_dbd SQL query to authenticate a user
AuthDBDUserPWQuery \
"SELECT password FROM authn WHERE user = %s"
</Directory>
严格来说,这意味着您要针对 Django 的数据库进行身份验证,而不是针对 Django 应用程序本身进行身份验证。请注意,您可以完全控制查询,因此您可以将其与任何表中的其他参数结合起来,以确保用户在允许身份验证之前处于良好的信誉,或在某些组中,或其他任何情况。
您可能需要大惊小怪,以确保在 apache 和 django 中使用的散列机制是相同的。
如果这不适合,请考虑将您的身份验证从 django 数据库移至 LDAP 服务器。通过自定义身份验证后端(现有 django 的 LDAP 实现),django 将愉快地使用 LDAP...并且 Apache 中的 LDAP auth/auth 支持非常强大。
【讨论】:
我知道这个问题很老,但只是作为补充......如果您使用的是 mod_python,您可能还对 Django 文档的“Authenticating against Django’s user database from Apache”部分感兴趣。
【讨论】: