it-swarm-ko.com

프로필에 액세스하지 마십시오 (사용자 / % 사용자 /보기)

ser/% user/view에 대한 액세스를 피하기 위해 관리자 만 프로필을 볼 수 있습니다. 처음에는 권한없이 user_view_access 권한을 변경하려고 시도했습니다.

Hook hook_menu_alter를 사용하려고했습니다.

53 function mymenu_menu_alter(&$items) {
54   $items['user'] = array(
55     'access callback' => 'user_access',                                                                                                                                                                                                  
56     'access arguments' => array('access administration pages'),                                                                                                                                                                         
57     'type' => MENU_NORMAL_ITEM,
58   );
59   $items['user/%user_uid_optional'] = array(
60     'access callback' => 'user_access',
61     'access arguments' => array('access administration pages'),
62      'type' => MENU_NORMAL_ITEM,
63   );
64   $items['user/%user/view'] = array(
65     'access callback' => 'user_edit_access',
66     'access arguments' => array('access administration pages'),
67     'type' => MENU_NORMAL_ITEM,
68   );

작동하지 않습니다. 힌트가 있습니까?

3
penyaskito

보고 한 코드에는 네 가지 문제가 있습니다.

  • 코드는 메뉴 유형을 변경하지 않아야 할 때 메뉴 유형을 변경합니다.
  • 코드는 사용자 프로필에 액세스 할 수있는 사람 만 변경하려는 경우 터치하지 않아야하는 값을 변경합니다.
  • ser_edit_access ()ser_access () 그들이받는 인수는 문자열이 아닌 사용자 객체가 될 것으로 예상합니다. "access arguments"를 array('access administration pages')로 설정하는 것은 잘못되었습니다.
  • "access arguments"를 array(1), user_edit_access()로 설정하더라도 사용자는 자신의 사용자 프로필을 볼 수 있습니다. 사용자에게 자신의 사용자 프로필을 표시하지 않으려면 해당 기능이 액세스 콜백으로 사용할 기능이 아닙니다.
  • Jhedstrom이 말했듯 이이 경우 코드를 사용할 필요가 없습니다. 사용자 프로필을보고 싶지 않은 역할에 대한 사용자 프로필에 대한 액세스 권한이 충분하지 않은 경우. 내가 줄 대답은 사용자가 자신의 프로필을 포함하여 사용자 프로필을 보지 않기를 원한다는 가정을 취합니다. 이 경우 Drupal 여전히 사용자가 자신의 사용자 프로필을 볼 수 있도록 허용하므로 사용자 프로필에 대한 액세스 권한을 제거해도 도움이되지 않습니다.
function mymenu_menu_alter(&$items) {
  $items['user/%user/view']['access callback'] = FALSE;
}

function mymenu_user_view_access($account) {
  return $account && $account->uid && user_access('administer users');
}
6
kiamlaluno

이 트릭을 위해 chain_menu_access 모듈을 사용했습니다. 아래 코드.

/**
 * Implements hook_menu_alter().
 */
function mymodule_menu_alter(&$items) {
  chain_menu_access_chain($items, 'user/%user', '_mymodule_check_permission');
}

function _mymodule_check_permission() {
  global $user;

  $own_profile = $user->uid == arg(1);
  $has_access = user_access('administer users');

  return (!$has_access && !$own_profile) ? FALSE : TRUE;
}
1
mrded

이것은 조금 늦어 지지만 다른 사람이 같은 문제가있는 경우를 대비하여 여기에 남겨 두겠습니다. :)

경로 액세스 가 있습니다 :

많은 Drupal 모듈은 어느 정도의 액세스 제어 권한을 제공하지만 사용자가 가질 수있는 모든 요구 사항을 다룰 수는 없습니다. Path_access는 경로 별명에 따라 페이지를 제한하는 수단을 제공합니다. 와일드 카드를 사용하여 사이트의 전체 섹션에서 특정 사용자 역할 그룹.

그러나 가장 좋은 옵션과 현재 마스터 .make 파일의 최상위에있는 모듈은 토끼 구멍 -노드, 사용자 및 분류 용어에 대한 사용자 지정 리디렉션을 지원합니다.

Rabbit Hole은 엔터티를 자체 페이지에서 볼 때 발생하는 상황을 제어하는 ​​기능을 추가하는 모듈입니다.

회전 목마에 표시되는 이미지 콘텐츠 유형과 같이 자체 페이지에 표시해서는 안되는 콘텐츠 유형이있을 수 있습니다. Rabbit Hole은 node/xxx를 통해 자체 페이지에서이 노드에 액세스 할 수 없도록합니다.

1
Chapabu

마지막으로 내가 원하는 것을 달성했습니다.

  function mymenu_menu_alter(&$items) {
   $items['user/%user_uid_optional'] = array(
      'page callback' => '_mymenu_profile_view',
      'page arguments' => array(1),
      'type' => MENU_LOCAL_TASK,
    );  
  }

  function _mymenu_profile_view($account) {
    global $user;
    if (user_access('administer users')) {
      include_once(drupal_get_path('module', 'user').'/user.pages.inc');
      return user_view($account);
    } else {
      return drupal_not_found();
    }   
  }

제안 해 주셔서 감사합니다!

1
penyaskito

사용자가 자신의 프로필을 편집 할 수는 있지만 볼 수는 없도록하려면 다음을 수행하십시오.

이미 패널 모듈을 사용하는 경우 선택 규칙에서 사용자에게 일반적인 패널을 보는 데 필요한 권한이없는 경우 (예 : User : Permission => 로그인 한 사용자에게 "사용자보기"가있는 경우) 사용자보기 재정의에서 두 번째 변형을 만들 수 있습니다. 프로필 "). HTTP 응답 코드를 선택하고 user/%user:uid/edit로 301 리디렉션을 선택하십시오.

그런 다음 CSS로보기 버튼을 숨기거나 위에서 언급 한 코드를 구현할 수 있습니다.

function mymodule_menu_alter(&$items) {
  $items['user/%user/view']['access callback'] = '_mymodule_user_view_access';
  $items['user/%user/view']['access arguments'] = array(1);
}

function _mymodule_user_view_access($account) {
  return $account && $account->uid && user_access('administer users');
}

또는 여러 방법을 사용하여 탭을 제거하십시오. 나는 다음이 Drupal 7)에서 작동해야하지만 아마도 올바른 방법이 아니거나 부작용이 있다고 가정합니다.

function mymodule_menu_local_tasks_alter(&$data) {
  foreach ($data['tabs'][0]['output'] as $key => $value) {
    if ($value['#link']['path'] == "user/%/view") {
      unset($data['tabs'][0]['output'][$key]);
    }
  }
}
0