web-dev-qa-db-ja.com

hook_permissionとアクセス制御[ユーザーがログインしていない場合にログインページにリダイレクトする方法]

「何が」ページにアクセスできるかをどのように制限しますか? hook_permission()アイテムへのアクセスを制御する役割に基づいてユーザー権限を設定するhook_menu()の使用方法についてはほとんど理解していません。ただし、システム自体でのみ使用されるhook_menu()アイテムがある場合はどうなりますか?たとえば、カスタムモジュールに登録ページがあるとします:module/register-誰でもそのページにアクセスできます。次に、管理者専用の別のページがあるとします。それで、私はhook_menu()に別のアイテムを登録し、それをmodule/register/reg_user_detailsと呼びます-誰もmodule/register/reg_user_detailsを閲覧できるようにしたくない

代わりに、ユーザーがログインしているときにのみページが表示されるようにしたいので、hook_permissionをすでに作成しています

/**
 * Implements hook_menu()
 * 
 */ 
function video_subtitles_menu() {
  $items = array();
  $items['video_subtitles/upload'] = array( //this creates a URL that will call this form at "video_subtitles_test/upload"
    'title' => 'Upload Subtitle', //page title
    'description' => 'Uploading subtitle for videos',
    'page callback' => 'drupal_get_form', //this is the function that will be called when the page is accessed.  for a form, drupal_get_form need to be used 
    'page arguments' => array('video_upload_subtitles_form'), //Name of the Uplaod Form 
    'access callback' => 'user_access',
    'access arguments' => array('administer video_subtitles module'),
  );

  $items['player/video_subtitle_status'] = array(
     'page callback' => 'video_subtitle_status',
     'access callback' => 'user_access',
     'access arguments' => array('administer video_subtitles status'),
  );
  return $items;
}

/**
 * Implements hook_permission.
 */
function video_subtitles_permission() {
  return array(
    'administer video_subtitles module' => array(
      'title' => t('Administer video_subtitles module'),
      'description' => t('Access the video_subtitles upload module Page'),
     ),
    'administer video_subtitles status' => array(
      'title' => t('Administer video_subtitles module status'),
      'description' => t('Access the video_subtitles module status Page'),
  ));
}

したがって、ユーザーはログインしていないとページにアクセスできませんが、ユーザーがadminとしてログインしていない場合は、ログインページにリダイレクトする必要があります。ログインに成功した場合は、ユーザーのページにリダイレクトする必要があります。

  1. uRLにアクセスd-7/example/my-module
  2. すでにログインしている場合は、ページを表示します
  3. ログインしていない場合はログインページにリダイレクトします
  4. ユーザーが正常にd-7/example/my-moduleページにリダイレクトした場合

これを達成するための最良の方法は何ですか

同様の質問

sing-hook-menu-with-hook-permission-access-denied

sing-hook-menu-and-hook-permission-to-control-access

can-someone-explain-access-arguments-in-drupal

1
Hitesh

最も簡単な方法は、page callback関数でこのロジックを指定することです。例:

function SOME_PAGE_CALLBACK($someArg) {
  if(user_is_anonymous()) {
    drupal_goto('PATH_TO_LOGIN_PAGE');
  }

  // do_something();
}

別の方法は、hook_preprocess_page関数でユーザーをチェックすることです。

function MY_THEME_preprocess_page(&$variables) {
  if(curent_path() == 'SOME_PATH' && user_is_anonymous()) {
    drupal_goto('PATH_TO_LOGIN_PAGE');
  }
}

アクセスコールバック関数は、リクエストへのユーザーのアクセスをチェックし、ブール値TRUEまたはFALSEを返します。ユーザーがページにアクセスできるかどうかをチェックしたい場合は、次のようにすることができます。

$path = current_path();
if ($router_item = menu_get_item($path)) {
  if (!$router_item['access']) {
    drupal_goto('PATH_TO_LOGIN_PAGE');
  }
}
2
xurshid29

Hook_menuですべてのユーザーにアクセスを許可します。

$items['player/my_page'] = array(
    'title' => t('My Page'), // note this is a required parameter
    'page callback' => 'my_page',
    'access callback' => TRUE,
);

次に、ページコールバック関数で、ログインしていないユーザーをリダイレクトします。

function my_page() {

    global $user;   
    if(!$user->uid) {
        $dest = drupal_get_destination();
        drupal_goto('user/login', $dest); / this remembers where the user is coming from
    }

    //  Carry on with rest of code...

}

ここでCliveが指摘した別のアプローチは、アクセスコールバック関数でこのチェックを行い、ページの構築に関連するロジックのためにページコールバック関数を残すことです。これらの2つの異なるタスクを独自の機能に分離するため、これはより良いアプローチだと思います。

1
Felix Eve