답변:
현재 로그인 한 사용자가 페이지에 액세스 할 수 있는지 확인하려면 다음 코드를 사용할 수 있습니다.
if ($router_item = menu_get_item($path)) {
if ($router_item['access']) {
// The user has access to the page in $path.
}
}
$path
확인하려는 페이지의 경로입니다 (예 : node / 1, admin / user / user).
이 코드는 Drupal 6 이상 버전에서 작동하며 menu_execute_active_handler () 에서 사용 된 코드 입니다.
액세스 콜백을 직접 호출하도록 제안하지 않는 이유는 해당 함수에 인수가 전달되어야하기 때문입니다.
_menu_check_access () 가 사용하는 코드 는 다음과 같습니다 (Drupal 7).
$arguments = menu_unserialize($item['access_arguments'], $map);
// As call_user_func_array is quite slow and user_access is a very common
// callback, it is worth making a special case for it.
if ($callback == 'user_access') {
$item['access'] = (count($arguments) == 1) ? user_access($arguments[0]) : user_access($arguments[0], $arguments[1]);
}
elseif (function_exists($callback)) {
$item['access'] = call_user_func_array($callback, $arguments);
}
가능한 한 일반적이어야하는 코드는 사용자 개체를 직접 처리하지 않습니다. 이는 현재 로그인 한 사용자의 사용자 개체를 다른 사용자 개체로 바꿀 수 없음을 의미합니다.
코드는 다음과 같은 메뉴 정의를 처리 할 수있을 정도로 일반적이어야합니다.
$items['node/add/' . $type_url_str] = array(
'title' => $type->name,
'title callback' => 'check_plain',
'page callback' => 'node_add',
'page arguments' => array($type->type),
'access callback' => 'node_access',
'access arguments' => array('create', $type->type),
'description' => $type->description,
'file' => 'node.pages.inc',
);
$items['node/%node'] = array(
'title callback' => 'node_page_title',
'title arguments' => array(1),
// The page callback also invokes drupal_set_title() in case
// the menu router's title is overridden by a menu link.
'page callback' => 'node_page_view',
'page arguments' => array(1),
'access callback' => 'node_access',
'access arguments' => array('view', 1),
);
두 정의 모두에서, 액세스 인수는 사용자 오브젝트를 포함하지 않으며이 경우 node_access () 는 현재 로그인 한 사용자의 사용자 오브젝트를 사용합니다. 두 번째 경우 인수 중 하나는 URL에서 얻은 노드 객체입니다. 예를 들어 URL이 example.com/node/1 인 경우 액세스 콜백에 전달 된 두 번째 인수는 노드 ID가 1 인 노드의 노드 객체입니다.
이러한 경우를 처리하는 코드를 작성하면 코드가 복제됩니다. Drupal에 이미 존재합니다. 해당 코드를 복제 한 경우에도 현재 로그인 한 사용자에 대해 액세스를 확인하는 액세스 콜백 문제가 여전히 있습니다.
현재 로그인 한 사용자가 아닌 사용자가 메뉴에 액세스 할 수 있는지 확인하려면 먼저 전역 변수의 값을 변경하고 $user
응답 시작 부분에보고 한 코드를 사용하여 값을 복원하십시오. $user
. 전역 값을 변경하는 방법 은 현재 로그인 한 사용자가 로그 아웃하지 않고 프로그래밍 방식으로 다른 사용자를 가장하는$user
것을 볼 수 있습니다 . 차이점은 대신에서 반환 된 값 사용하는, 즉 drupal_anonymous_user을 () , 당신은에서 반환 된 값을 사용 user_load을 () .
drupal_valid_path () 시도하십시오 .
반환되는 함수는 TRUE
인수가 존재하고 현재 사용자가 액세스 한 경로로 전달 된 경로입니다. Drupal 7에서 작업 중이고 현재 로그인 한 사용자의 액세스 권한을 확인해야하는 경우 가장 쉬운 방법입니다.
if (drupal_valid_path('my/path')) {
// Your code here...
}
drupal_valid_path
작업이 완벽하게 수행되며 이러한 정확한 요구를 충족 시키도록 만들어졌습니다. menu_get_item을 사용하고 액세스도 확인합니다.
drupal_valid_path
도움이되지 않습니다.
access callback
페이지를 담당하는 메뉴 항목에 지정된를 호출 하십시오. 해당 메뉴 항목은 일반적으로 Drupal에서 구현을 호출하여 작성 hook_menu
하며 데이터베이스 어딘가에 저장됩니다. 반환 된 데이터는 hook_menu
구현하는 모듈에 의해 변경 될 수 있습니다 hook_menu_alter
.
일부 모듈은 access arguments
메뉴 항목 의 키로 지정된대로 사용자를 별도의 인수로 전달하지 않고 대신 전역 $user
객체를 사용할 수 있습니다 . 사용하는 각 모듈에 대해이를 확인해야합니다.
user_access()
기능을 확인하십시오 . 각 버전의 Drupal에 대해 지정된 매개 변수에 대한 링크를 참조하십시오. Drupal 7-8 설명서 페이지에서 :
매개 변수
$ string 확인되는 "관리 노드"와 같은 권한.
$ account (선택 사항) 현재 로그인 한 사용자에게 사용 권한이없는 경우 확인할 계정입니다.
반환 값
부울 현재 사용자에게 요청 된 권한이있는 경우 TRUE입니다.
Drupal의 모든 권한 검사는이 기능을 거쳐야합니다. 이러한 방식으로 일관된 동작을 보장하고 수퍼 유저가 모든 작업을 수행 할 수 있도록합니다.
user_access()
항상 메뉴에서 사용하는 액세스 콜백은 아닙니다. 조차도 전달해야하는 액세스 인수를 알아야합니다 user_access()
.
user_access()
. OP가 사용자에게 액세스 권한이 있는지 확인하는 권한을 염두에두고 있다고 생각했습니다. 매우 설명적인 질문이 아닙니다
사용자가 특정 노드에 액세스 할 수 있고 노드 액세스 모듈을 사용 중인지 알아야 하는 경우 node_access ()를 사용할 수 있습니다 . (노드 액세스 모듈이 없으면 '콘텐츠 액세스'권한 만 있으면됩니다.)
사용자가 hook_menu () 구현으로 정의 된 임의의 경로에 액세스 할 수 있는지 알아 내려면 데이터베이스에서 메뉴 항목을 검색하여 'access callback'매개 변수를 평가해야합니다.