Разрешения на URL-адрес


У меня есть несколько узлов, которые я хочу скрыть от анонимных пользователей, когда они получают доступ по прямому URL, например /node/1275.

Однако, если кто-то обращается к этому через псевдоним URL, который является хэшем md5, я хочу разрешить анонимным пользователям доступ к нему. Это делается для того, чтобы узел, по сути, был доступен только тем людям, которым я даю ссылку.

Как бы я этого добился? В идеале я бы хотел избежать установки дополнительных модулей.


ИЗМЕНИТЬ:

Вот полный решение, которое я использовал в своем пользовательском модуле. Помимо проверки доступа, он содержит новый тип фильтра, который генерирует md5 для каждого узла, который вы можете использовать на странице Шаблоны псевдонимов URL.

 /**
 * Implements hook_menu_alter
 */
function newsletter_access_menu_alter(&$items){
  $items['node/%node']['access callback'] = 'newsletter_access_check_node_access';
}

/**
 * Custom menu access callback for node/%node
 */
function newsletter_access_check_node_access($op, $node){

  // Note $op and $node are passed in default node_menu access arguments
  if ($op == 'view' && isset($node->nid)) {
     if($node->type == "newsletter") {
            // Allow access to anon if request_uri contains specific hash
            if (!user_is_logged_in()) {
              $hash = md5(drupal_get_private_key() . $node->nid);
              // request_uri includes alias
              $request = explode('/', request_uri());
              if (in_array($hash, $request)) {
                return TRUE;
              } else {
                return FALSE;
              }
            }
        }
      }
  // Fallback to allow regular node_access checks
  return node_access($op, $node);
}


function newsletter_access_token_info() {
  $types['my_tokens'] = array(
    'name' => t("My Tokens"),
    'description' => t("My Token Category"),
  );

  $tokens['my_md5'] = array(
    'name' => t("Unique MD5 Hash"),
    'description' => t("The md5 hash unique for each node."),
  );

  return array(
    'types' => $types,
    'tokens' => array(
      'my_tokens' => $tokens,
    ),
  );

}

function newsletter_access_tokens($type, $tokens, array $data = array(), array $options = array()) {

  $replacements = array();

  if ($type == 'my_tokens') {
    foreach ($tokens as $name => $original) {
      switch ($name) {
        case 'my_md5':
          $replacements[$original] =  md5(drupal_get_private_key() . $data['node']->nid);
        break;
      }
    }
  }

  return $replacements;
}

?>
 1
Author: ankles, 2013-06-21

2 answers

Вы могли бы сделать что-то вроде

/**
 * Implements hook_menu_alter
 */
function MY_MODULE_menu_alter(&$items){
  $items['node/%node']['access callback'] = 'MY_MODULE_check_node_access';
}

/**
 * Custom menu access callback for node/%node
 */
function MY_MODULE_check_node_access($op, $node){
  // Note $op and $node are passed in default node_menu access arguments
  if ($op == 'view' && isset($node->nid)) {
    // Allow access to anon if request_uri contains specific hash
    if (!user_is_logged_in()) {
      $hash = md5(drupal_get_private_key() . md5($node->nid));
      // request_uri includes alias
      $request = explode('/', request_uri());
      if (in_array($hash, $request)) {
        return TRUE;
      } else {
        return FALSE;
      }
    }
  }
  // Fallback to allow regular node_access checks
  return node_access($op, $node);
}
 4
Author: David Thomas, 2013-06-24 23:36:40

Пробовали ли вы в template.php? что, если вы сделаете что-то вроде:

function yourtheme_preprocess_page(&$variables, $hook){
   if((arg(0) == 'node') && (!$user->uid)){
      //redirect
   }
}
 0
Author: Jose Daniel, 2013-06-21 22:59:16