사용자가 특정 페이지에 액세스 할 수 있는지 확인


23

사용자에게 특정 페이지에 대한 액세스 권한이 있는지 어떻게 알 수 있습니까?


사용하는 Drupal 버전을 지정하지 않았습니다. 목표에 대한 자세한 내용도 유용합니다. 가장 일반적인 경우 Drupal은 메뉴 액세스를 자동으로 처리합니다.
Dylan Tack

답변:


25

현재 로그인 한 사용자가 페이지에 액세스 할 수 있는지 확인하려면 다음 코드를 사용할 수 있습니다.

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을 () .


이 코드를 작성해야하는 후크를 알고 싶습니다.
검투사

14

drupal_valid_path () 시도하십시오 .

반환되는 함수는 TRUE인수가 존재하고 현재 사용자가 액세스 한 경로로 전달 된 경로입니다. Drupal 7에서 작업 중이고 현재 로그인 한 사용자의 액세스 권한을 확인해야하는 경우 가장 쉬운 방법입니다.

if (drupal_valid_path('my/path')) {
  // Your code here...
}

1
D7에서는 drupal_valid_path작업이 완벽하게 수행되며 이러한 정확한 요구를 충족 시키도록 만들어졌습니다. menu_get_item을 사용하고 액세스도 확인합니다.
Weboide

사실이지만 현재 로그인 한 사용자에게만 적용됩니다. 다른 사용자가 경로에 액세스 할 수 있는지 알고 싶다면 drupal_valid_path도움이되지 않습니다.
Andrew Schulman

@AndrewSchulman 그것에 대한 API는 없다고 생각하지만 일시적으로 사용자를 전환 할 수 있습니다.
peterpoe

Drupal 8에서 이것은 API 문서를\Drupal::service('path.validator')->isValid($path); 참조하십시오
Gogowitsch

3

access callback페이지를 담당하는 메뉴 항목에 지정된를 호출 하십시오. 해당 메뉴 항목은 일반적으로 Drupal에서 구현을 호출하여 작성 hook_menu하며 데이터베이스 어딘가에 저장됩니다. 반환 된 데이터는 hook_menu구현하는 모듈에 의해 변경 될 수 있습니다 hook_menu_alter.

일부 모듈은 access arguments메뉴 항목 의 키로 지정된대로 사용자를 별도의 인수로 전달하지 않고 대신 전역 $user객체를 사용할 수 있습니다 . 사용하는 각 모듈에 대해이를 확인해야합니다.


이 방법을 사용하면 실제 사용자가 아닌 다른 사용자가 해당 페이지에 액세스 할 수 있는지 확인할 수 있습니다.
Oswald

1
액세스 콜백을 호출하는 것은 다른 함수를 호출하는 것만 큼 쉽지 않습니다. 액세스 콜백에는 특정 인수가 필요합니다. 현재 로그인 한 사용자가 메뉴에 액세스 할 수 있는지 확인하는 함수 인 _menu_check_access ()를 참조하십시오 .
kiamlaluno

2

user_access()기능을 확인하십시오 . 각 버전의 Drupal에 대해 지정된 매개 변수에 대한 링크를 참조하십시오. Drupal 7-8 설명서 페이지에서 :

매개 변수

$ string 확인되는 "관리 노드"와 같은 권한.

$ account (선택 사항) 현재 로그인 한 사용자에게 사용 권한이없는 경우 확인할 계정입니다.

반환 값

부울 현재 사용자에게 요청 된 권한이있는 경우 TRUE입니다.

Drupal의 모든 권한 검사는이 기능을 거쳐야합니다. 이러한 방식으로 일관된 동작을 보장하고 수퍼 유저가 모든 작업을 수행 할 수 있도록합니다.


user_access ()는 사용자에게 특정 "유형"의 권한이 있는지 확인하기위한 것입니다. 사용자가 특정 "경로"에 액세스 할 수 있어야합니다. 예를 들어, 사용자가 'node / 12'에 액세스 할 수 있습니까?
farzan

그렇다면 언제 사용자에게 권한이 있는지를 어떻게 판단합니까? 권한 페이지에 특정 역할에 권한을 부여하거나 부여하지 않은 옵션이 있다고 가정합니다.
Laxman13

user_access()항상 메뉴에서 사용하는 액세스 콜백은 아닙니다. 조차도 전달해야하는 액세스 인수를 알아야합니다 user_access().
kiamlaluno

나는 그것이 항상 그런 것은 아니라는 것을 알고 있습니다 user_access(). OP가 사용자에게 액세스 권한이 있는지 확인하는 권한을 염두에두고 있다고 생각했습니다. 매우 설명적인 질문이 아닙니다
Laxman13

user_access가 특정 경로에 대한 액세스를 확인할 수는 없지만 가능한 경우 user_access를 사용하는 것이 액세스를 확인하는 가장 좋은 방법이라고 생각합니다. 좋은 답변 @ Laxman13 +1.
AyeshK

2

사용자가 특정 노드에 액세스 할 수 있고 노드 액세스 모듈을 사용 중인지 알아야 하는 경우 node_access ()를 사용할 수 있습니다 . (노드 액세스 모듈이 없으면 '콘텐츠 액세스'권한 만 있으면됩니다.)

사용자가 hook_menu () 구현으로 정의 된 임의의 경로에 액세스 할 수 있는지 알아 내려면 데이터베이스에서 메뉴 항목을 검색하여 'access callback'매개 변수를 평가해야합니다.


2
    $node = node_load(123);

    $account = user_load(456);

    if (node_access("update", $node, $account) === TRUE) 
   {

         print "access";    
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.