Batasi peran mana yang dapat melihat simpul berdasarkan jenis kontennya

18

Saya menggunakan Drupal 7 dan saya membuat jenis konten baru yang disebut "eBook," dan saya membuat peran baru yang disebut "MonthlySubscriber." Tujuan saya adalah untuk mengizinkan hanya pengguna dengan "MonthlySubscriber" untuk melihat node "eBook". Ketika saya melihat pengaturan izin untuk sebuah peran, saya melihat kotak centang yang memungkinkan untuk membuat, mengedit, dan menghapus node dari jenis konten itu, tetapi tidak ada kotak centang untuk melihat node.

Bagaimana cara membatasi pengguna yang dapat melihat node "eBuku" hanya untuk pengguna dengan peran "Pembeli Bulanan"?

John
sumber

Jawaban:

13

Anda perlu menginstal modul Akses Konten untuk menambahkan kontrol akses ini.

Modul ini memungkinkan Anda untuk mengelola izin untuk jenis konten berdasarkan peran dan penulis. Ini memungkinkan Anda menentukan tampilan khusus, mengedit, dan menghapus izin untuk setiap jenis konten.

iStryker
sumber
5

Untuk drupal 7, coba gunakan hook_node_access () :

/**
 * 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;
}
Denis
sumber
1
Harap hindari jawaban hanya kode. Mereka tidak melayani tujuan pembelajaran. Setidaknya jelaskan dalam satu atau tiga kalimat bagaimana tepatnya kode khusus ini merupakan jawaban? Bagaimana cara kerjanya? mengapa ini bekerja? Jenis deskripsi yang akan membantu orang lain untuk menulis kode serupa dalam situasi yang sama, alih-alih bertanya berulang-ulang.
Mołot
Ini seharusnya jawaban yang benar.
GrafiCode
5

Berikut adalah cara sederhana melindungi halaman simpul (node ​​/ NID) dari pengguna yang tidak memiliki hak.

/**
 * 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);
}
ya.teck
sumber
2
Perhatikan bahwa menggunakan hook_node_accesstidak akan bekerja dengan apa pun yang "daftar" node, seperti Tampilan. Jadi, Anda dapat membatasi akses tampilan hook_node_access, tetapi tampilan atau kueri simpul kustom masih dapat menunjukkan simpul itu kepada pengguna. hook_node_accesslebih berguna untuk kontrol editorial, untuk mengendalikan operasi create / update / delete
Brian
Kode Anda tidak berfungsi untuk saya, tetapi Anda mengarahkan saya ke arah yang benar. Saya menemukan kode yang berfungsi pada dokumentasi hook_node_access api.drupal.org/api/drupal/modules%21node%21node.api.php/…
Camilo
Ini adalah contoh yang buruk karena menggunakan mymodule_node_access sebagai fungsi khusus sementara Drupal menyediakan hook hook_ode_access. Ini bisa membingungkan.
batigolix
@batigolix, sebagaimana dinyatakan dalam jawaban itu adalah cara untuk melindungi halaman node bukan node.
ya.teck
2

Akses Konten tidak berfungsi untuk pemasangan Drupal 7 saya, jadi saya menggunakan Izin Node View .

Sam King
sumber
1

Untuk drupal 7, coba yang ini: Access by Term

Menyediakan kontrol akses simpul yang sangat fleksibel dan hierarkis (kontrol akses konten), untuk D7.

washooo
sumber
0

Solusi hook_menu_alter yang diposting di atas oleh ya.teck tidak berfungsi, tetapi konflik dengan hook_node_access standar dalam nama fungsinya. hook_menu_alter tidak diperlukan dalam kasus ini, jadi jawaban yang diposting oleh Denis di atas menurut saya lebih akurat dan cara yang tepat. Mengubah menu_item seperti yang dilakukan adalah contoh yang direferensikan pertama dapat dihancurkan oleh modul lain lebih jauh ke bawah pipa.

ben.hamelin
sumber
0

Saya menggunakan potongan kode yang ditemukan dalam dokumentasi api D7 untuk hook hook_ode_access .

Kode ini akan memberikan akses untuk melihat konten "ebook" kepada pengguna yang memiliki izin "lihat ebook".

Anda memerlukan izin baru untuk mengontrol akses dengan menerapkan hook_permission ().

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

Dengan menerapkan hook_node_access () Drupal dapat memberikan atau menolak akses ke node.

/**
 * 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;
}

Izin lainnya (edit, hapus, dll) dapat ditangani melalui izin Drupal normal.

Secara opsional, Anda dapat menghapus konten dari tinjauan umum admin dengan menerapkan hook_query_TAG_NAME_alter.

/**
 * 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', '!=');
  }
}
batigolix
sumber
0

Saya perfer menggunakan modul Izin Node View . Lebih sederhana dari modul Akses Konten.

Seperti di D6, itu menambahkan izin "Lihat konten apa saja" dan "Lihat konten sendiri" ke semua jenis konten yang Anda pilih.

masukkan deskripsi gambar di sini

Langkah-langkah untuk diikuti:

  1. Setelah menginstal dan mengaktifkan, buka /admin/config/content/node-view-permissionsdan pilih jenis konten yang ingin Anda batasi aksesnya.
  2. Lalu, pergi ke /admin/people/permissions#module-node_view_permissions dan pilih peran yang Anda inginkan untuk dapat melihat konten. Simpan izin.

    Selesai!

Chris Happy
sumber
untuk drupal 8 "Izin Node View" tidak berfungsi
Karthikeyan Manivasagam
@KarthikeyanManivasagam Bagaimana?
Chris Happy
Kami menggunakan modul ini di salah satu proyek kami di mana kami perlu menyediakan akses tampilan konten berdasarkan peran dan jenis konten, tetapi tidak berfungsi sama sekali. berperilaku tetap sama seperti tanpa menggunakan modul ini.
Karthikeyan Manivasagam