Просмотры Поиск Без учета разрешений на доступ к пользовательскому узлу
У меня есть функция hook_node_access, которая запрещает пользователям просматривать доступ к узлу страницы, если у узла есть определенный тег, и они не являются аутентифицированным пользователем.
Это нормально работает для прямого просмотра страницы, но незарегистрированные пользователи все равно могут видеть узлы, в которых им следует отказать, на странице поиска с поддержкой представлений. Когда они переходят на страницу, им отказывают в доступе.
Я использовал модуль управления доступом к таксономии, чтобы сделать это раньше, и это скрывало результат поиска, мне пришлось отключить его из-за конфликта с другим модулем.
Есть ли что-нибудь дополнительное, что мне нужно сделать, чтобы представления распознавали эти разрешения?
Вот мой крючок и вспомогательная функция:
function mymod_page_perms_node_access($node, $op, $account){
if ($op === 'view' && in_array($node->type, array('page','publication'))){
$access_level = field_get_items('node', $node, 'field_access_level');
if (count($access_level)){
$access_level = $access_level[0]['tid'];
$accessIDtoRoleID = array(
'68' => '7',
'69' => '2');
if (isset($accessIDtoRoleID[$access_level])){
global $user;
$requiredRole = $accessIDtoRoleID[$access_level];
if (mymod_page_perms_check_allowed_roles_array(array($requiredRole),$user->roles)){
return NODE_ACCESS_ALLOW;
} else {
return NODE_ACCESS_DENY;
}
}
}
}
return NODE_ACCESS_IGNORE;
}
function mymod_page_perms_check_allowed_roles_array($allowedRolesIds,$roles){
foreach ($roles as $rid => $role){
if (in_array($rid, $allowedRolesIds)){
return true;
}
}
return false;
}
Спасибо
1 answers
Похоже, что лучший способ контролировать доступ к узлу - это использовать hook_node_access_records и hook_node_grants, как описано здесь http://drupal.org/node/1260948 . Это правильно работает с представлениями.
Я написал этот простой модуль на основе инструкций по ссылке выше:
define('MYMOD_REALM', 'mymod');
define('MYMOD_GRANT_ID_PUBLIC', 0);
define('MYMOD_GRANT_ID_MEMBER', 1);
define('MYMOD_GRANT_ID_BOARD', 2);
define('MYMOD_BOARD_MEMBER_RID', 7);
define('MYMOD_MEMBER_TID', 69);
define('MYMOD_BOARD_MEMBER_TID', 68);
/**
* Implementation of hook_node_grants().
*/
function mymod_node_grants($account, $op) {
if ($op == 'view') {
$grants[MYMOD_REALM] = array( MYMOD_GRANT_ID_PUBLIC );
if (array_key_exists(DRUPAL_AUTHENTICATED_RID, $account->roles)) {
$grants[MYMOD_REALM][] = array( MYMOD_GRANT_ID_MEMBER );
}
if (array_key_exists(MYMOD_BOARD_MEMBER_RID, $account->roles)) {
$grants[MYMOD_REALM][] = array( MYMOD_GRANT_ID_BOARD );
}
return $grants;
}
}
/**
* Implementation of hook_node_access_records().
*/
function mymod_node_access_records($node) {
$grant = array(
'realm' => MYMOD_REALM,
'gid' => MYMOD_GRANT_ID_PUBLIC,
'grant_view' => 1,
'grant_update' => 0,
'grant_delete' => 0,
'priority' => 0,
);
if (in_array($node->type, array('page','publication'))){
$access_level = field_get_items('node', $node, 'field_access_level');
if (count($access_level)){
$access_level = (int)$access_level[0]['tid'];
switch ($access_level) {
case MYMOD_BOARD_MEMBER_TID:
$grant['gid'] = MYMOD_GRANT_ID_BOARD;
break;
case MYMOD_MEMBER_TID:
$grant['gid'] = MYMOD_GRANT_ID_MEMBER;
break;
}
}
}
$grants[] = $grant;
return $grants;
}