Hangi rollerin içerik türüne göre bir düğümü görüntüleyebileceğini sınırlama


18

Drupal 7 kullanıyorum ve "eKitap" adlı yeni bir içerik türü oluşturdum ve "MonthlySubscriber" adlı yeni bir rol oluşturdum. Amacım sadece "MonthlySubscriber" olan kullanıcıların "eKitap" düğümlerini görüntülemesine izin vermektir. Bir rolün izin ayarlarına baktığımda, o içerik türünün düğümlerini oluşturmaya, düzenlemeye ve silmeye izin veren onay kutularını gördüm, ancak düğümleri görüntülemek için onay kutusu yok.

"E-Kitap" düğümlerini görüntüleyebilen kullanıcıları yalnızca "MonthlySubscriber" rolüne sahip kullanıcılarla nasıl sınırlayabilirim?

Yanıtlar:


13

Bu erişim denetimini eklemek için İçerik Erişimi modülünü yüklemeniz gerekir .

Bu modül, içerik türleri için izinleri role ve yazara göre yönetmenizi sağlar. Her içerik türü için özel görünüm, düzenleme ve silme izinleri belirlemenizi sağlar.


5

Drupal 7 için hook_node_access () yöntemini kullanmayı deneyin :

/**
 * Implements hook_node_access().
 */
function YOURMODULE_node_access($node, $op, $account) {
  if (
    $node->type == 'ebook' &&
    $op == 'view' &&
    !in_array('MonthlySubscriber', $account->roles)
  ) { return NODE_ACCESS_DENY; }
  return NODE_ACCESS_IGNORE;
}

1
Lütfen yalnızca kod yanıtlarından kaçının. Hiçbir öğrenme amacına hizmet etmezler. En azından bir cümle veya üçte bu özel kodun tam olarak nasıl bir cevap olduğunu açıklayın? O nasıl çalışır? neden çalışıyor? Tekrar tekrar sormak yerine başkalarının benzer durumlarda benzer kod yazmalarına yardımcı olacak açıklama türü.
Ayı

Bu doğru cevap olmalı.
GrafiCode

5

Düğüm sayfalarını (düğüm / NID) ayrıcalıksız kullanıcılardan korumanın basit bir yolu.

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

/**
 * Determines whether the current user may perform the operation on the node.
 */
function mymodule_check_node_access($op, $node) {
  if ($node->type == 'protected_type' && !user_access('administer site configuration')) {
    return FALSE;
  }
  return node_access($op, $node);
}

2
Kullanmanın hook_node_access, Görünüm gibi düğümleri "listeleyen" hiçbir şeyle çalışmayacağını unutmayın . Bu nedenle, görünüm erişimini kısıtlayabilirsiniz hook_node_access, ancak bir Görünüm veya özel düğüm sorgusu yine de kullanıcıya bu düğümü gösterebilir. hook_node_accessoluşturma / güncelleme / silme işlemlerini kontrol etmek için editoryal kontrol için daha kullanışlıdır
Brian

Kodun benim için çalışmıyor, ama sen beni doğru yöne doğrulttun. Hook_node_access belgelerinde çalışma kodunu buldum api.drupal.org/api/drupal/modules%21node%21node.api.php/…
Camilo

Bu kötü bir örnektir, çünkü Drupal bir hook_node_access kancası sağlarken mymodule_node_access'i özel işlev olarak kullanır. Bu kafa karıştırıcı olabilir.
batigolix

@batigolix, yanıtta belirtildiği gibi, düğüm sayfalarını değil düğüm sayfalarını korumanın bir yoludur.
ya.teck



0

Yukarıda ya.teck tarafından gönderilen hook_menu_alter çözümü çalışıyor, ancak işlev adındaki standart hook_node_access ile çakışıyor. Bu durumda hook_menu_alter gerekli değildir ve bu nedenle yukarıdaki Denis tarafından verilen cevap bence daha doğru ve doğru bir şekilde. Menu_item'i yapıldığı gibi değiştirmek, ilk başvurulan örnek başka bir modül tarafından borunun aşağısında tıkanabilir.


0

Hook_node_access kancası için D7 api belgelerinde bulunan bir kod snippet'i kullandım .

Bu kod, "e-kitabı görüntüle" iznine sahip kullanıcılara "e-kitap" içeriğini görüntüleme erişimi verecektir.

Hook_permission () uygulayarak erişimi kontrol etmek için yeni bir izne ihtiyacınız var.

/**
 * Implements hook_permission().
 */
function mymodule_permission() {
  return array(
    'view ebook' => array(
      'title' => t('View Ebook'),
      'description' => t('View Ebook nodes.'),
    ),
  );
}

Hook_node_access () uygulayarak Drupal, düğüme erişim izni verebilir veya erişimi engelleyebilir.

/**
 * Implements hook_node_access().
 */
function mymodule_node_access($node, $op, $account) {

  // Checks for an ebook node in view mode.
  if (is_object($node) && $node->type === 'ebook' && $op === 'view') {

    // Grants permission to view the node if the current user has an role
    // with the permission 'view ebook'.
    if (user_access('view ebook')) {
      return NODE_ACCESS_ALLOW;
    }

    // Otherwise disallows access to view the node.
    return NODE_ACCESS_DENY;
  }
  // For all other nodes and other view modes, don't affect the access.
  return NODE_ACCESS_IGNORE;
}

Diğer izinler (düzenleme, silme, vb.) Normal Drupal izinleri aracılığıyla ele alınabilir.

İsteğe bağlı olarak, hook_query_TAG_NAME_alter uygulayarak içeriği yönetici genel bakışından kaldırabilirsiniz.

/**
 * Implements hook_query_TAG_NAME_alter().
 */
function mymodule_query_node_admin_filter_alter(QueryAlterableInterface $query) {
  if (!user_access('view ebook')) {
  $query->condition('n.type', 'ebook', '!=');
  }
}

0

Düğüm Görünümü İzinleri modülünü kullanarak perfer yapıyorum . İçerik Erişimi modülünden daha basittir.

D6'da olduğu gibi, seçtiğiniz herhangi bir içerik türüne "Herhangi bir içeriği görüntüle" ve "Kendi içeriğini görüntüle" izinleri ekler.

resim açıklamasını buraya girin

Takip edilecek adımlar:

  1. Yükledikten ve etkinleştirdikten sonra, /admin/config/content/node-view-permissionserişimi sınırlamak istediğiniz içerik türlerine gidin ve seçin.
  2. Ardından, /admin/people/permissions#module-node_view_permissions içeriği görüntülemek istediğiniz rollere gidin ve seçin. İzinleri kaydedin.

    Bitti!


8 "Düğüm Görünümü İzinler" çalışmıyor
Karthikeyan Manivasagam

@KarthikeyanManivasagam Nasıl?
Chris Happy

Bu modülü, rol ve içerik türüne göre içerik görüntüleme erişimi sağlamamız gereken projemizden birinde kullandık, ancak hiç çalışmıyor. bu modülü kullanmadan aynı kalır.
Karthikeyan Manivasagam
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.