프로그래밍 방식으로 블록에 대한 액세스 권한을 어떻게 할당합니까?


10

프로그래밍 방식으로 블록을 만들었지 만 프로그래밍 방식으로 액세스를 할당하는 방법을 모르겠습니다. 어떻게하면 되나요?


질문을 확장하고 코드를 보여줄 수 있습니까?
Triskelion

블록 코드 자체에서 사용자 (전역 $ user)를 조회하고 링크의 메소드를 사용하여 역할을 확인할 수 있습니다. bywombats.com/blog/ryan/10-25-2007/…
user6614

패널 모듈에는 블록이 아닌 영역을 사용하는 훌륭한 액세스 제어 기능이 있습니다.
Louis

답변:


10

반환 된 배열에서 "역할"배열을 설정하면 hook_block_info()작동하지 않습니다.

  • 블록을 볼 수 있고 사용자 인터페이스에 설정된 역할 은 "block_role"테이블의 block_admin_configure_submit () 에서 저장됩니다.

    $query = db_insert('block_role')->fields(array('rid', 'module', 'delta'));
    foreach (array_filter($form_state['values']['roles']) as $rid) {
      $query->values(array(
        'rid' => $rid,
        'module' => $form_state['values']['module'],
        'delta' => $form_state['values']['delta'],
      ));
    }
    $query->execute();
  • 현재 로그인 한 사용자에게 표시 할 블록을 결정하는 코드는 hook_block_list_alter () 의 구현 인 block_block_list_alter () 에 포함되어 있으며 해당 테이블의 내용 만 사용합니다.

    $result = db_query('SELECT module, delta, rid FROM {block_role}');
    foreach ($result as $record) {
      $block_roles[$record->module][$record->delta][] = $record->rid;
    }
    
    foreach ($blocks as $key => $block) {
      if (!isset($block->theme) || !isset($block->status) || $block->theme != $theme_key || $block->status != 1) {
        // This block was added by a contrib module, leave it in the list.
        continue;
      }
    
      // If a block has no roles associated, it is displayed for every role.
      // For blocks with roles associated, if none of the user's roles matches
      // the settings from this block, remove it from the block list.
      if (isset($block_roles[$block->module][$block->delta]) && !array_intersect($block_roles[$block->module][$block->delta], array_keys($user->roles))) {
        // No match.
        unset($blocks[$key]);
        continue;
      }
    
      // …
    
    }
  • 에서 반환 된 데이터 의 역할 속성 을 확인하는 또 다른 Drupal 함수는 hook_block_info()없으며 "block_role"테이블의 내용이 hook_block_info()구현 에서 반환 된 내용과 병합되지도 않습니다 .

에서 블록을 확인하는 데 필요한 역할이 사용자에게 있는지 확인할 수 hook_block_view()있지만 그 시점에서 Drupal은 이미 블록을 렌더링하고 있습니다. 즉, 블록 제목이 이미 설정된 경우 사용자에게 여전히 블록 제목이 표시됩니다.

hook_block_list_alter()사용자에게 필요한 역할이 없을 때 해당 블록에 대한 정보를 제거하기 위해 구현할 수 있습니다 .
블록을 관리하는 사용자에게 혼동을 피하기 위해 블록을 편집하는 데 사용되는 양식을 변경하고 블록을 구현하는 모듈이 자신의 목록을 사용하므로 해당 블록을 볼 수있는 역할을 설정하는 데 사용되는 양식 필드를 비활성화합니다. 역할 최소한의 코드는 최소한 역할 설정에 아무런 영향을 미치지 않는다는 메시지를 표시해야하지만 역할 설정에 대한 양식 요소도 비활성화해야합니다.

블록 모듈에는 블록을 볼 역할을 선택하는 양식 필드가 이미 표시되어 있으므로 블록에 대한 기본값을 설정하고 필요한 경우 관리자가이를 변경할 수 있습니다.

스크린 샷

사용자가 가지고있는 역할을 확인하는 것과 사용자가 가지고있는 권한을 확인하는 것에 따라, 특히 대안이 모듈의 역할 목록을 하드 코딩 할 때 마지막이 선호됩니다.
블록 모듈에서 볼 수 있듯이 권한을 사용하는 것이 유일한 대안은 아닙니다. 모듈은 어떤 역할을 볼 수 있는지 결정하기위한 설정을 가질 수 있습니다.
분명히, 역할이 무언가를 할 수있는 환경을 설정하는 것이 항상 가치있는 것은 아닙니다. 또한 관리자가 10 개의 모듈에 권한을 사용하는 대신 역할을 수행하여 역할을 수행 할 수있는 자체 설정이 있고 관리자 사용자가 단일 페이지를 사용하여 설정할 수있는 경우 어떤 의미가 있는지 상상합니다.


글쎄, 나는 분명히 이것과 가장 적절한 대답으로 갈 것입니다. Drupal 블록이 배후에서 어떻게 작동하는지 이해하는 데 실제로 도움이되므로 자세한 설명을 주셔서 감사합니다.
user5013

1

hook_block_info에서 다음과 같은 것을 시도 할 수 있습니다.

$blocks['myblock'] = array(
   ...
   'roles' => array(
      'administrator' => '3',
      'authenticated user' => '2',
   )

이것은 접근 방식이있는 역할을 정의한 다음 Drupal이 사용자가 액세스 할 수 있는지 여부를 결정하도록하는 프로그래밍 방식을 사용하여이를 구현하는 가장 좋은 방법 인 것 같습니다. 이 접근 방식의 단점을 놓쳤습니까?
user5013

프로그래밍 방식으로해야한다면 그렇습니다. 단점은 없습니다. 그러나 단순히 / admin / structure / block으로 이동하여 블록에 역할을 할당하는 것에 대한 매우 좋은 사용 사례가 있어야한다고 가정 합니다.
Triskelion

유스 케이스는 사용자를 위해 자동으로 설정되므로 필요하지 않습니다. 엄밀히 말하면 편리한 문제입니다. 일단 설정되면 특정 요구에 맞지 않으면 원하는대로 변경할 수 있습니다.
user5013

1
작동하지 않습니다. 왜 그렇지 않은지에 대한 내 대답을 참조하십시오.
kiamlaluno

0

hook_block_info ()로 직접 블록을 만들고 있다고 가정하면 hook_block_view () 함수에서 user_access ()를 수행 할 수 있습니다. 예를 들어 API 문서를 확인하십시오 .


예, user_access 사용에 대해 생각해야합니다. 내 마음이 완전히 미끄러 져-D' oh. 역할 액세스를 사용하려고 생각하지만 권한 액세스가 더 나은 방법 일 수 있습니다.
user5013

0

hook_block_info ()에서는 불가능하지만이 쿼리를 사용하여이를 달성 할 수 있습니다. MODULE_NAME, BLOCK_DELTA 및 RID를 적절히 변경하십시오.

$query = db_insert('block_role')
  ->fields(array(
    'module' => 'MODULE_NAME', 
    'delta' => 'BLOCK_DELTA', 
    'rid' => 2, // Authenticated User
  ))
  ->execute();

0

hook_block_view에서 사용할 수있는 global $user사용자에 대한 정보를 얻으려면, 당신은 다른 할당 할 수있는 사용자의 역할에 따라 block['subject']block['content']하거나 해당 역할에 대한 보이지 않는 될 것입니다 경우에도 블록에 어떤 주제와 컨텐츠를 할당하지 않습니다. 다음은 예입니다.

function ModuleNAME_block_view($delta = '') {
  switch ($delta) {
    case 'Your_BLOCK' :
      Global $user;
      if($user->uid != '0') {
        $block['subject'] = 'SUBJECT';
        $block['content'] = 'SOME CONTENT OR A FUNCTION FOR BLOCK';
      }
      break;
  }
  return $block;
}

이 코드를 사용하면 게스트가 아닌 인증 된 사용자가 인증 된 사용자에게 블록이 표시됩니다.

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