系統中使用者對 node 的權限控制其是以 node type 為基礎的控制方式, 若自己要在更細部的控制到每一個 node 則須做些設計, 而個別 node 系統內通用控制的權限儲存在 node_access table 內, 一般是藉由 hook_node_access_records 產生node的個別控制權限內容, 若要自行在特定情況下產生 node 的控制權限資料可下語法如下
注意, 整個系統的權限檢查流程(如下圖), user角色權限會在 hook_node_grants 之上, 一旦角設權限已授權, 接下 hook_node_grants 就無效用.
node_access 資料表. 預設內容如下:
http://www.slideshare.net/nyccamp/nyc-nodeaccessrickard
http://www.phase2technology.com/blog/drupal-7-node-access-grants-locks-a...
$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 的管控.->fields('n', array('nid'))
->condition('nid',$node->nid)
->addTag('node_access');
$result = $query->execute();
注意, 整個系統的權限檢查流程(如下圖), user角色權限會在 hook_node_grants 之上, 一旦角設權限已授權, 接下 hook_node_grants 就無效用.
node_access 資料表. 預設內容如下:
*nid | *gid | *realm | grant_view | grant_update | grant_delete |
0 | 0 | all | 1 | 0 | 0 |
https://drupal.org/node/1260948define('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; } }
http://www.slideshare.net/nyccamp/nyc-nodeaccessrickard
http://www.phase2technology.com/blog/drupal-7-node-access-grants-locks-a...