Разрешения на 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;
}
?>
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);
}
Пробовали ли вы в template.php? что, если вы сделаете что-то вроде:
function yourtheme_preprocess_page(&$variables, $hook){
if((arg(0) == 'node') && (!$user->uid)){
//redirect
}
}