您在這裡

疑難雜症: 權限管理 - 為什麼無法檢視文章

bobju's 的頭像
bobju 在 2010-04-18 (周日) 23:35 發表

這兩天為了一個疑難雜症傷透腦筋, 好不容易終於解決了, 以下把這經過用條列的方式逐一說明:

01 發現 admin 新增的 node , 除了 admin 可以檢視外, 匿名user 及 已驗證user 都無法檢視.

02 甚至 已驗證user 自己新增的 node, 自己都無法檢視.

以上兩點實在是有違常理, 因為正常情形下是一定可以檢視的.

03 以[管理者]身份檢查[權限記錄表](User management > Permissions), 確認對於所有 role 該給的權限都已有設好, 沒有問題.

04 重建[權限記錄表](Content management > Post setting > Rebuild permissions)後(過程順利, 沒出現任何錯誤訊息), 1, 2 的問題依舊存在.

反覆不斷地嘗試 3, 4各種可能性的組合設定, 問題依舊無法解決.

05 透過 phpmyadmin, 手動檢視 drupal 資料庫結構, 希望從[權限記錄表]的資料結構上找到線索.

06 發現 {node_access} 這個資料表的內容是空的, 這裏有問題. 因為平時這個資料表是用來記錄 role 對 node 的存取權限用的.

07 為什麼會是空的呢? 經過重載備份資料後, 再反覆試誤, 後來確認是因為上述 4 所造成的: 原本預期重建後的權限記錄並沒有被寫入!

至此, 造成上述 1, 2 兩項描述的原因找到了, 接著就要查為什麼重建後的權限記錄並沒有被寫入?

08 利用notepad++的關鍵字目錄搜尋翻程式碼, 找出對{node_access}這個資料表有寫入動作的程式段, 以求釐清系統運作的脈絡.

這個 08 過程有點複雜, 一下子迸出一堆相關的線索, 以下是理出頭緒後的描述.

09 在 user 執行 重建[權限記錄表] 這個動作時, 系統內部會有一連串的動作:

09.1 node.module 的 node_access_rebuild 這個函式會被呼叫.

09.2 而 node_access_rebuile 函式又會呼叫 node_access_aquire_grants 這個函式.

09.3 而 node_access_aquire_grants 函式又會呼叫 node_access_write_grants 這個函式.

09.4 node_access_write_grants 負責實際寫入資料庫的動作: 對於每一個 node 進行如下的操作:

09.4.1 刪除既存的權限記錄, 並

09.4.2 寫入新的權限記錄( $grant 的 grant_view, grant_update, grant_delete, 特別注意此三者不可同時為 0, 理由請見 drupal v6.16 的 node.module 的 node_access_write_grants函式內容 ).

後來經過持續追蹤才發現: 上述 09.4.1 被執行了, 但 09.4.2 卻被跳過, 也正是如此, 才造成上述 06 所描述的狀況.

那為什麼 09.4.2 被跳過了呢? 事後確定是跟 Taxonomy Access Control(TAC) 這個模組有關. 這是個外掛的分類管理模組, 它可以用來設定 user 對[分類](vocabulary), 以及對[分類項目](term)的存取權限. 以下補充說明TAC模組的安裝設定情境.

T.1 安裝/啟動 TAC 這個模組後, 資料庫會多出 2 個資料表: {term_access_defaults} 以及 {term_access}

T.1.1 {term_access_defaults} 是用來記錄 管理者 所設定的 user 對 分類 的[存取權限]預設值.

T.1.2 {term_access} 是用來記錄 管理者 所設定的 user 對 分類項目 的[存取權限].

上述要特別注意的是 T.1.1, 看似是只對 分類 做存取權限的設定, 然而實際上若設定不當的話, 就會在 user 執行 重建[權限記錄表] 這個動作時, 出現 06 所描述的狀況, 影響到所有 role 對所有 node 的存取權限.

關於這段, 可以追蹤 drupal 6.16 的 taxonomy_access.module 檔裏的 taxonomy_access_node_access_records 這個函式的內容. 這是 TAC 對 系統 node 模組的 "node_access_records" hook 的實作函式, 在 user 重建[權限記錄表]的過程當中會被呼叫到, 之所以會對既有node的存取權限造成影響, 也正是由此開始.

什麼是 TAC 不當的設定呢? 請參考下圖:

那該如何修復呢? 很簡單, 只要把 TAC 下每個 role 的"檢視權限"打開後, 再 重建[權限記錄表] 就行了. 請參考下圖:

至於 TAC 的權限設定的進入點, 如下圖所示:

對各別的 role 做設定:

那為什麼在一開始遭遇到問題時, 沒有檢查到TAC的設定這裏來呢? 因為想不到. XD , 就算是想到了, 也不會聯想到中間的關聯. 平時設定權限都只會想到 03 所描述的情境, 怎會想到跟 taxnomy 有關呢? 而且這個TAC下的設定究竟是如何"玩"到變成(view,update,delete)=>(0,0,0) 的? 也不可考了. drupal 官網上找過去的討論, 發現很多人都曾經遭遇過 重建[權限記錄表]後, 整個系統node的檢視權限都失靈的狀況, 至於如何解決, 也是眾說紛紜, 沒一個確定的描述. 以上將個人遭遇到的狀況做個如上所描述的, 希望對以後遭遇到類似狀況的 d友們 提供一個參考(及解決方式).