Apache HTTP Server 版本 2.4

| 描述 | 使用 SQL 进行组授权和登录 |
|---|---|
| 状态 | 扩展 |
| 模块标识符 | authz_dbd_module |
| 源文件 | mod_authz_dbd.c |
| 兼容性 | 在 Apache 2.4 及更高版本中可用 |
此模块提供授权功能,以便通过组成员资格允许或拒绝经过身份验证的用户访问网站的某些部分。mod_authz_groupfile 和 mod_authz_dbm 提供类似的功能,区别在于此模块查询 SQL 数据库以确定用户是否为某个组的成员。
此模块还可以提供基于数据库的用户登录/注销功能。当与 mod_authn_dbd 结合使用时,这些功能可能最有价值。
此模块依赖于 mod_dbd 来指定后端数据库驱动程序和连接参数,并管理数据库连接。
Apache 的 Require 指令在授权阶段使用,以确保用户被允许访问资源。mod_authz_dbd 使用 dbd-group、dbd-login 和 dbd-logout 扩展了授权类型。
从 v2.4.8 开始,表达式 在 DBD require 指令中受支持。
此指令指定用户获得访问权限所需的组成员资格。
Require dbd-group team AuthzDBDQuery "SELECT user_group FROM authz WHERE user = %s"
此指令指定要运行的查询,指示用户已登录。
Require dbd-login AuthzDBDQuery "UPDATE authn SET login = 'true' WHERE user = %s"
此指令指定要运行的查询,指示用户已注销。
Require dbd-logout AuthzDBDQuery "UPDATE authn SET login = 'false' WHERE user = %s"
除了检查组成员资格的标准授权功能之外,此模块还可以通过基于数据库的登录/注销功能提供服务器端用户会话管理。具体来说,它可以在用户访问指定 URL 时更新数据库中的用户会话状态(当然,前提是用户提供必要的凭据)。
这是通过定义两种特殊的 Require 类型来实现的:Require dbd-login 和 Require dbd-logout。有关使用详细信息,请参见下面的配置示例。
一些管理员可能希望实现与此模块提供的服务器端登录/注销功能协同工作的客户端会话管理,例如,在用户登录或注销时设置或取消设置 HTTP cookie 或其他此类令牌。
为了支持这种集成,mod_authz_dbd 导出一个可选的钩子,该钩子将在用户状态在数据库中更新时运行。其他会话管理模块可以使用该钩子来实现启动和结束客户端会话的功能。
# mod_dbd configuration
DBDriver pgsql
DBDParams "dbname=apacheauth user=apache pass=xxxxxx"
DBDMin 4
DBDKeep 8
DBDMax 20
DBDExptime 300
<Directory "/usr/www/my.site/team-private/">
# mod_authn_core and mod_auth_basic configuration
# for mod_authn_dbd
AuthType Basic
AuthName Team
AuthBasicProvider dbd
# mod_authn_dbd SQL query to authenticate a logged-in user
AuthDBDUserPWQuery \
"SELECT password FROM authn WHERE user = %s AND login = 'true'"
# mod_authz_core configuration for mod_authz_dbd
Require dbd-group team
# mod_authz_dbd configuration
AuthzDBDQuery "SELECT group FROM authz WHERE user = %s"
# when a user fails to be authenticated or authorized,
# invite them to login; this page should provide a link
# to /team-private/login.html
ErrorDocument 401 "/login-info.html"
<Files "login.html">
# don't require user to already be logged in!
AuthDBDUserPWQuery "SELECT password FROM authn WHERE user = %s"
# dbd-login action executes a statement to log user in
Require dbd-login
AuthzDBDQuery "UPDATE authn SET login = 'true' WHERE user = %s"
# return user to referring page (if any) after
# successful login
AuthzDBDLoginToReferer On
</Files>
<Files "logout.html">
# dbd-logout action executes a statement to log user out
Require dbd-logout
AuthzDBDQuery "UPDATE authn SET login = 'false' WHERE user = %s"
</Files>
</Directory>
| 描述 | 确定在成功登录或注销时是否将客户端重定向到引用页面(如果存在 Referer 请求标头)。 |
|---|---|
| 语法 | AuthzDBDLoginToReferer On|Off |
| 默认值 | AuthzDBDLoginToReferer Off |
| 上下文 | 目录 |
| 状态 | 扩展 |
| 模块 | mod_authz_dbd |
与 Require dbd-login 或 Require dbd-logout 结合使用时,这提供了将客户端重定向回引用页面(Referer HTTP 请求标头中的 URL,如果存在)的选项。当没有 Referer 标头时,AuthzDBDLoginToReferer On 将被忽略。
| 描述 | 指定所需操作的 SQL 查询 |
|---|---|
| 语法 | AuthzDBDQuery query |
| 上下文 | 目录 |
| 状态 | 扩展 |
| 模块 | mod_authz_dbd |
AuthzDBDQuery 指定要运行的 SQL 查询。查询的目的取决于生效的 Require 指令。
Require dbd-group 指令一起使用时,它指定一个查询来查找当前用户的组。这是其他授权模块(如 mod_authz_groupfile 和 mod_authz_dbm)的标准功能。查询语句返回的每一行的第一列值应包含一个字符串,其中包含组名。可以返回零行、一行或多行。Require dbd-group AuthzDBDQuery "SELECT group FROM groups WHERE user = %s"
Require dbd-login 或 Require dbd-logout 指令一起使用时,它永远不会拒绝访问,而是执行一个旨在登录或注销用户的 SQL 语句。用户必须已经使用 mod_authn_dbd 进行身份验证。Require dbd-login AuthzDBDQuery "UPDATE authn SET login = 'true' WHERE user = %s"
在所有情况下,用户 ID 将作为单个字符串参数传递,当执行 SQL 查询时。它可以使用 %s 格式说明符在查询语句中引用。
| 描述 | 指定一个查询来查找用户的登录页面 |
|---|---|
| 语法 | AuthzDBDRedirectQuery query |
| 上下文 | 目录 |
| 状态 | 扩展 |
| 模块 | mod_authz_dbd |
指定一个可选的 SQL 查询,在成功登录(或注销)后使用,将用户重定向到一个 URL,该 URL 可能特定于用户。用户 ID 将作为单个字符串参数传递,当执行 SQL 查询时。它可以使用 %s 格式说明符在查询语句中引用。
AuthzDBDRedirectQuery "SELECT userpage FROM userpages WHERE user = %s"
查询语句返回的第一行的第一列值应包含一个字符串,其中包含要将客户端重定向到的 URL。后续行将被忽略。如果未返回任何行,则客户端将不会被重定向。
请注意,如果同时设置了 AuthzDBDLoginToReferer,则它优先。