Apache 模块 mod_authz_dbd

Description:组授权和使用 SQL 登录
Status:Extension
Module Identifier:authz_dbd_module
Source File:mod_authz_dbd.c
Compatibility:在 Apache 2.4 和更高版本中可用

Summary

此模块提供授权功能,以便可以通过组成员身份来允许或拒绝经过身份验证的用户访问网站的某些部分。 mod_authz_groupfilemod_authz_dbm提供了类似的功能,但该模块查询 SQL 数据库以确定用户是否为组的成员。

该模块还可以提供数据库支持的用户登录/注销功能。与mod_authn_dbd结合使用时,这些值可能最具价值。

此模块依靠mod_dbd来指定后端数据库驱动程序和连接参数,并 Management 数据库连接。

要求指令

在授权阶段使用 Apache 的Require指令来确保允许用户访问资源。 mod_authz_dbd 使用dbd-groupdbd-logindbd-logout扩展授权类型。

从 v2.4.8 开始,DBD require 指令支持expressions

Require dbd-group

该指令指定用户获得访问权限所需的组成员身份。

Require dbd-group team
AuthzDBDQuery "SELECT group FROM authz WHERE user = %s"

Require dbd-login

该伪指令指定要运行的查询,指示用户已登录。

Require dbd-login
AuthzDBDQuery "UPDATE authn SET login = 'true' WHERE user = %s"

Require dbd-logout

该指令指定要运行的查询,指示用户已注销。

Require dbd-logout
AuthzDBDQuery "UPDATE authn SET login = 'false' WHERE user = %s"

Database Login

除了检查组成员身份的标准授权功能之外,该模块还可以通过数据库支持的登录/注销功能提供服务器端用户会话 Management。具体来说,每当用户访问指定的 URL 时,它就可以更新数据库中用户的会话状态(当然,这取决于提供必要凭据的用户)。

这通过定义两种特殊的Require类型起作用:Require dbd-loginRequire dbd-logout。有关用法的详细信息,请参见下面的配置示例。

Client 端登录集成

一些 Management 员可能希望实现与该模块提供的服务器端登录/注销功能协同工作的 Client 端会话 Management,例如,通过在用户登录或注销时设置或取消设置 HTTP cookie 或其他此类令牌, 。

为了支持这种集成,mod_authz_dbd导出一个可选的钩子,该钩子将在数据库中更新用户状态时运行。然后,其他会话 Management 模块可以使用该钩子来实现启动和结束 Client 端会话的功能。

Configuration example

# 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>

AuthzDBDLoginToReferer Directive

Description:确定是否存在Referer请求 Headers 时是在成功登录还是注销时将 Client 端重定向到引荐页面
Syntax:AuthzDBDLoginToReferer On|Off
Default:AuthzDBDLoginToReferer Off
Context:directory
Status:Extension
Module:mod_authz_dbd

Require dbd-loginRequire dbd-logout结合使用,这提供了将 Client 端重定向回引荐页(Referer HTTP 请求 Headers 中的 URL,如果存在)的选项。如果没有RefererHeaders,则AuthzDBDLoginToReferer On将被忽略。

AuthzDBDQuery Directive

Description:为所需的操作指定 SQL 查询
Syntax:AuthzDBDQuery query
Context:directory
Status:Extension
Module:mod_authz_dbd

AuthzDBDQuery指定要运行的 SQL 查询。查询的目的取决于有效的Require指令。

  • Require dbd-group指令一起使用时,它指定查询以查找当前用户的组。这是其他授权模块(例如mod_authz_groupfilemod_authz_dbm)的标准功能。查询语句返回的每一行的第一列值应为包含组名的字符串。可能会返回零,一或多个行。
Require dbd-group
AuthzDBDQuery "SELECT group FROM groups WHERE user = %s"
  • Require dbd-loginRequire dbd-logout伪指令一起使用时,它将永远不会拒绝访问,而是执行旨在登录或注销用户的 SQL 语句。用户必须已经通过mod_authn_dbd进行了身份验证。
Require dbd-login
AuthzDBDQuery "UPDATE authn SET login = 'true' WHERE user = %s"

在所有情况下,执行 SQL 查询时,用户 ID 都将作为单个字符串参数传递。它可以使用%s格式说明符在查询语句中引用。

AuthzDBDRedirectQuery Directive

Description:指定查询以查找用户的登录页面
Syntax:AuthzDBDRedirectQuery query
Context:directory
Status:Extension
Module:mod_authz_dbd

指定一个可选的 SQL 查询,该查询在成功登录(或注销)后用于将用户重定向到特定于该用户的 URL。执行 SQL 查询时,用户 ID 将作为单个字符串参数传递。它可以使用%s格式说明符在查询语句中引用。

AuthzDBDRedirectQuery "SELECT userpage FROM userpages WHERE user = %s"

查询语句返回的第一行的第一列值应该是一个字符串,其中包含要将 Client 端重定向到的 URL。随后的行将被忽略。如果没有返回任何行,则不会重定向 Client 端。

请注意,如果同时设置了AuthzDBDLoginToReferer,则优先。