個別 node 的權限控制機制

1 篇文章 / 0 new
author
個別 node 的權限控制機制
系統中使用者對 node 的權限控制其是以 node type 為基礎的控制方式, 若自己要在更細部的控制到每一個 node 則須做些設計, 而個別 node 系統內通用控制的權限儲存在 node_access table 內, 一般是藉由 hook_node_access_records 產生node的個別控制權限內容, 若要自行在特定情況下產生 node 的控制權限資料可下語法如下
$query = db_select('node', 'n')
    ->fields('n', array('nid'))
    ->condition('nid',$node->nid)
    ->addTag('node_access');
$result = $query->execute();
上程式執行後, 則會在 node_access 內產生一筆該 node 的獨立控制紀錄, 用來對該 node 的 view,update,delete 的管控.
注意, 整個系統的權限檢查流程(如下圖), user角色權限會在 hook_node_grants 之上, 一旦角設權限已授權, 接下 hook_node_grants 就無效用.

node_access 資料表. 預設內容如下:
*nid *gid *realm grant_view grant_update grant_delete
0 0 all 1 0 0
define('NODE_ACCESS_EXAMPLE_GRANT_ALL', 23);
//授於當前使用者該 node 權限
function node_access_example_node_grants($account, $op) {
    // 首先授於node作者自己的控制權限.
    // 權限方式為 $grants[realm]=gId 表示使用哪一組權限模式
    $grants['node_access_example_author'] = array($account->uid);
    if ($op == 'view' && user_access('access any private content', $account)) {
        $grants['node_access_example_view'] = array(NODE_ACCESS_EXAMPLE_GRANT_ALL);
    }
    if (($op == 'update' || $op == 'delete') && user_access('edit any private content', $account)) {
        $grants['node_access_example_edit'] = array(NODE_ACCESS_EXAMPLE_GRANT_ALL);
    }
    return $grants;
}
//定義 node 的各組 realm 讀取權限, 僅在 新增/編輯/重建權限 時才會被呼叫
function node_access_example_node_access_records($node) {
    if (!empty($node->private)) {
        $grants = array();
        $grants[] = array(
            'realm' => 'node_access_example_view',
            'gid' => NODE_ACCESS_EXAMPLE_GRANT_ALL,
            'grant_view' => 1,
            'grant_update' => 0,
            'grant_delete' => 0,
            'priority' => 0,
        );
        $grants[] = array(
            'realm' => 'node_access_example_edit',
            'gid' => NODE_ACCESS_EXAMPLE_GRANT_ALL,
            'grant_view' => 1,
            'grant_update' => 1,
            'grant_delete' => 1,
            'priority' => 0,
        );
        // the grant ID (gid) = user ID (UID).
        $grants[] = array(
            'realm' => 'node_access_example_author',
            'gid' => $node->uid,
            'grant_view' => 1,
            'grant_update' => 1,
            'grant_delete' => 1,
            'priority' => 0,
        );
        return $grants;
    }
}
 
https://drupal.org/node/1260948
http://www.slideshare.net/nyccamp/nyc-nodeaccessrickard
http://www.phase2technology.com/blog/drupal-7-node-access-grants-locks-a...
關鍵字: 
Free Web Hosting