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
。
從 2.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"
在所有情況下,執行 SQL 查詢時,使用者的 ID 均會作為單一字串參數傳遞。可以使用 %s
格式規範說明符在查詢陳述式內參照它。
說明 | 設定查詢以查詢使用者的登入頁面 |
---|---|
語法 | AuthzDBDRedirectQuery query |
內容 | 目錄 |
狀態 | 延伸 |
模組 | mod_authz_dbd |
指定在成功登入 (或登出) 後使用的 SQL 查詢,以將使用者重新導向到特定使用者的 URL。執行 SQL 查詢時,使用者的 ID 會傳遞為單一字串參數。可以在查詢陳述中使用 %s
格式規範說明符來參照它。
AuthzDBDRedirectQuery "SELECT userpage FROM userpages WHERE user = %s"
查詢陳述傳回的第一列第一個值應該是包含要將使用者重新導向到的網址的字串。將會忽略後續列。如果沒有傳回列,則不會重新導向使用者。
請注意,如果同時設定 AuthzDBDLoginToReferer
和本指令,則 AuthzDBDLoginToReferer
會優先。