user_access ($ string) 함수에 사용 가능한 $ string 값 목록을 찾으려면 어떻게해야합니까?


27

user_access ($ 문자열, $ 계정 = NULL)

$ string : "관리 노드"와 같은 권한을 점검하고 있습니다.

user_access()함수 에 사용 가능한 $ string 값 목록을 찾으려면 어떻게 해야합니까?

답변:


12

모든 모듈이 자신의 권한을 정의 할 수있는 한 해당 문자열의 "엄격한"목록은 없습니다. 프로그래밍 방식으로 그러한 목록이 실제로 필요한 경우에는 "구성"해야합니다.

이 스크립트는 / devel / php 페이지에서 실행할 수 있습니다. (물론, Devel 모듈 이 필요합니다 .)

// Render role/permission overview:
$options = array();
foreach (module_list(FALSE, FALSE, TRUE) as $module) {
  print_r($module);
  // Drupal 6
  // if ($permissions = module_invoke($module, 'perm')) {
  //  print_r($permissions);
  // }

  // Drupal 7
  if ($permissions = module_invoke($module, 'permission')) {
    print_r($permissions);
  }
}

26

@Berdir이 말했듯이 사용 가능한 권한을 확인하는 가장 쉬운 방법은 Drupal 7의 권한 관리자 / 사람 / 권한으로 이동하는 것입니다.

내가 계속 겪고있는 문제는 실제로 사용 권한을 사용하기 위해 '액세스 인수'로 제공 해야하는 문자열을 알 수 없다는 것입니다. 사용하려는 권한의 문자열 이름을 찾는 방법은 다음과 같습니다 (이 예는 Chrome을 사용합니다).

1 단계. 관리자 / 사람 / 권한으로 이동하여 사용하려는 권한을 찾은 다음 사용하려는 권한 오른쪽의 확인란을 마우스 오른쪽 단추로 클릭하십시오. '요소 검사'를 선택하거나 소스를 살펴보십시오.

예

그런 다음 확인란의 값을 찾아서 값을 확인하십시오. (이 경우 문자열은 '쿠폰 내용 작성')

여기에 이미지 설명을 입력하십시오

hook_menu () 에서 액세스 인수로 제공해야하는 문자열입니다.

예제 코드 : (관련이없는 항목이 제거되었습니다. hook_menu () 에서 제목, 콜백 등을 잊지 마십시오 )

function fsrsys_menu() {
    $items = array();
    $items['my-custom-url'] = array(
        'access callback' => 'user_access',
        'access arguments' => array('create coupon content'),
    );
    return $items;
}

9

다음은 print_r 대신 DSM을 사용하고 hook_permission을 구현하지 않는 모듈을 제외하도록 수정 된 Haza의 답변의 D7 버전입니다.

// Render permission overview:
$options = array();
foreach (module_list(FALSE, FALSE, TRUE) as $module) {
  if ($permissions = module_invoke($module, 'permission')) {
    // List only the modules that have permissions.
    dsm($module);
    dsm($permissions);
  }
}

6

user_permission_get_modules()정의 된 모든 권한 및 해당 모듈의 배열을 반환하는 function 을 사용할 수 있습니다 .

권한이 속하는 모듈을 결정하십시오.

반환 값

$ permission => $ module 형식의 연관 배열.


2
당신이 그것을 포장 array_keys()하면 분명히 요청 된 정보를 얻을 수 있습니다. 그런 다음 user_role_grant_permissions예를 사용하여 관리자 역할에 모든 권한을 부여 할 수도 있습니다 .user_role_grant_permissions(variable_get("user_admin_role"), array_keys(user_permission_get_modules()));
aross

4

가장 쉬운 방법은 권한 페이지 (D7 : admin / people / permissions, D6 : admin / user / permissions)를 확인하는 것입니다. Drupal 6에 표시된 문자열을 직접 사용하므로 7의 경우 확인란 이름 / 값을 확인해야합니다. 권한이 이제 Drupal 7에서 제목과 설명을 번역했기 때문입니다.

따라서 Drupal 7에서 "게시 된 컨텐츠보기"권한의 이름을 원하는 경우 값은 "액세스 컨텐츠"이며 이는 권한 이름입니다.

권한이 어느 모듈에서 오는지 알고 있으면 해당 모듈의 해당 hook_perm () (D6) / hook_pemission () (D7) 구현을 확인할 수도 있습니다.

많은 경우에, 당신은 당신의 자신의 pemissions를 정의하고 이것을 사용하기를 원합니다. 위의 훅으로 그렇게 할 수 있습니다.


RE : "가장 쉬운 방법은 권한 페이지를 확인하는 것입니다 (D7 : admin / people / permissions,).". 이 페이지에는 권한 목록이 표시되지만 시스템에서 읽을 수있는 문자열이 아니라 사람이 읽을 수있는 문자열입니다.
gilzero

1
아래에 적어 놓은 것처럼 컴퓨터 판독 가능 이름은 주어진 권한에 대한 모든 확인란의 값에서 추출 할 수 있습니다.
Berdir

이 답변은 Drupal 6과 7에 적용됩니다. Drupal 6 만 허용됩니다. 그러나 허용 된 답변은 깔끔한 트릭이며 Drupal 7에 대해 쉽게 변경할 수 있습니다. =)
Greg

4

개발 모듈 사용

  • Devel 모듈을 설치하고 활성화 한 후로 이동하십시오 admin/config/development/devel. "권한 및 모듈의 시스템 이름 표시"라는 제목의 설정이 있습니다. 반드시 확인하십시오.

  • 의 권한 페이지에서 people/permissions질문중인 권한 이름 위로 마우스를 가져갑니다. 1-2 초 지연 될 수 있지만 문자열 값이 표시됩니다.


와우, 나는 이것에 대해 몰랐다. 답변을 게시 한 후 봤습니다. 감사!
Batandwa

매우 유용한! TYVM.
DrCord

모듈 코드를 여는 것보다 달콤하고 훨씬 쉽습니다!
bloke_zero

1

다음은 권한 페이지의 이름에 권한 키를 추가하는 간단한 양식 alter입니다. 쉽게 찾을 수 있어야합니다. 사용자 정의 모듈에 추가하고 "mymodule"을 해당 모듈의 이름으로 바꿔야합니다.

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_user_admin_permissions_alter(&$form, $form_state) {
  foreach ($form['permission'] as $key => &$item) {
    if (isset($item['#type']) && $item['#type'] == 'item') {
      $item['#markup'] .= ' (' . $key . ')';
    }
  }
}

1

나는 이것을 도와주는 JavaScript 스 니펫 을 만들었습니다 . Drupal 7에서는 Shiny 테마 에서만 테스트했습니다 .

기본적으로 시스템 이름을 해당 이름의 첫 번째 확인란에서 레이블 아래의 첫 번째 셀로 출력합니다. 이 스크립트는 jQuery에 의존하며 Drupal 7에서는 문제가되지 않습니다.

일반적으로 개발자 도구 콘솔에 붙여넣고 거기서 실행합니다. 나중에 북마크를 만들 수도 있습니다.

// Go through each of the rows on the permissin table
rows = jQuery('#permissions tr');
rows.each(function() {
    // Get the first checkbox in the row.
    checkbox = jQuery('.checkbox .form-checkbox', this).first();
    // Get the first cell, containing the permission label.
    nameCell = jQuery('td:first-child', this);
    // In case this is not a permission row
    if(checkbox.length == 0) {
        return;
    }

    // Embed the permission maching name on permission label cell.
    nameCell.append("<div><code>" + checkbox.val() + "</code></div>");
});


이것은 정말 유용한 도구입니다!
DrCord



0

일부 모듈 만 드롭하면 / admin / people / permissions에 시스템 권한이 표시됩니다.

function YOURMODULE_form_user_admin_permissions_alter(&$form, &$form_state) 
{
    $perms = &$form['permission'];

    $group_counter = 0;
    foreach ($perms as $k => &$v) {
        if ($k == $group_counter) { // skip fieldsets
            $group_counter++;
            continue;
        }

        $v['#markup'] .= ' (<span class="description" style="color:brown">'.$k.'</span>)'; 
    }
}

문안 인사

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