답변:
액세스 컨텐츠 시스템의 주요 목적은 모든 사용자가 가능한 모든 보안 문제를보고 피할 수있는 것을 제어하는 것입니다. 이것은 원하는 동작이며 거의 모든 모듈 또는 일반 ApI에서 사용하므로 기본 솔루션을 찾을 수 없습니다.
나는 같은 상황에 있었고 내가 찾은 유일한 해결책은 사용자 정의 모듈을 만들고 내 경우에는 원하는 모든 요소를 얻기 위해 메뉴 테이블에 직접 쿼리하고 링크를 표시 할 수있는 권한을 직접 확인하는 것입니다. 사용자에게 콘텐츠를 볼 권한이없는 경우 콘텐츠 제목
나는 커스텀 모듈을 통해 이것을했다 :
function mymodule_form_menu_edit_item_alter(&$form, &$form_state, $form_id) {
if ($form_state['build_info']['args'][0] == 'edit') {
$item = $form_state['build_info']['args'][1];
$form['ignore_access_roles'] = array(
'#type' => 'checkboxes',
'#multiple' => TRUE,
'#title' => t("Ignore access"),
'#options' => user_roles(),
'#description' => t("If a user with one of the selected roles has no access to the menu item's path, the menu item is <strong>not</strong> hidden."),
'#default_value' => empty($item['options']['ignore_access_roles']) ? array() : $item['options']['ignore_access_roles'],
);
$form['#validate'][] = 'mymodule_form_menu_edit_item_validate';
}
}
function mymodule_form_menu_edit_item_validate(&$form, &$form_state) {
if (isset($form_state['values']['ignore_access_roles'])) {
$form_state['values']['options']['ignore_access_roles'] = $form_state['values']['ignore_access_roles'];
$form_state['values']['options']['alter'] = TRUE;
}
}
function mymodule_translated_menu_link_alter(&$link, $map) {
if (!empty($link['options']['ignore_access_roles']) && empty($link['access'])) {
global $user;
// Get role ids for which the ignore access option applies.
$rids = array_values($link['options']['ignore_access_roles']);
$matching_rids = array_intersect(array_keys($user->roles), $rids);
if (!empty($matching_rids)) {
// User has one of the specified roles: override menu link access.
$link['access'] = TRUE;
// Localize. This must be done because it is only done for links with
// access TRUE in _menu_link_translate.
_menu_item_localize($link, $map, TRUE);
}
}
}
나는 이것을 처리하기 위해 사용자 정의 모듈을 작성해야한다고 확신합니다. 내 생각은 : 콘텐츠 액세스 제한을 완화하십시오. 즉, 사용자가 귀하의 콘텐츠를 볼 수있게하십시오. 그런 다음 사용자 정의 모듈은 hook_node_load ()를 구현하고 사용자가 볼 수없는 노드를로드 할 때 403 HTTP 응답을 출력해야합니다. 또한 hook_permission ()도 구현해야하므로 권한 페이지에서 쉽게 액세스를 구성 할 수 있습니다.
다음은 전체 노드를 숨기고 컨텐츠 유형 및 권한으로 필터링하는 간단한 예입니다.
function mymodule_permission() {
return array('access reserved content');
}
function mymodule_node_load($nodes, $types) {
if (in_array('my_reserved_content_type', $types)) {
if (!user_access('access reserved content')) {
drupal_access_denied();
}
}
}
또는 403을 반환하는 대신 일부 노드 필드를 숨길 수 있습니다. 그러나 hook_node_load ()에 대한 API 설명서에 따라 권장하지 않습니다.
admin/structure/menu/manage/main-menu/add
?