Memiliki pandangan yang menghormati hook_node_access

14

Saya menggunakan hook_node_access()untuk menolak akses pengguna ke beberapa node berdasarkan kriteria khusus. Namun, saya tidak ingin konten ini muncul dalam tampilan yang mencantumkannya jika pengguna tidak lulus kriteria. Apakah ada cara untuk memiliki pandangan menghargai hook_node_access()implementasi?

nenne
sumber
Jika modul Views tidak benar-benar menghormati izin akses yang ditetapkan dengan hook_node_access(), ada hal yang harus dilakukan: untuk mengubah kode modul Views.
kiamlaluno
Saya tidak berpikir bahwa hook dipecat sampai node benar-benar dimuat secara keseluruhan dengan node_load jadi itu mungkin mengapa masih muncul. Namun saya sudah mulai bekerja pada plugin filter yang akan menggunakan metode yang sama untuk menyaring bahwa implementasi hook_node_access () digunakan untuk mengunci orang. Saya hanya perlu ingat untuk menambahkan filter itu di semua pandangan saya dan itu akan berfungsi. Saya akan kembali ke sini dengan info tentangnya setelah saya selesai sehingga orang lain dapat memperoleh manfaat.
nenne
Ok, jadi kasus penggunaan saya adalah ini: Pelanggan ingin 10 tingkat akses berlaku untuk setiap node dan pengguna harus dapat melihat semua node di bawah tingkat akses mereka. Ini mudah diselesaikan melalui hook_node_access untuk tampilan simpul standar. Namun, karena pandangan tidak menghormati ini saya membuat filter kontekstual dengan kode php khusus untuk argumen. Kode php pada dasarnya mengembalikan nilai lebih rendah dari atau sama dengan tingkat akses pengguna (dalam sintaksis yang tepat dipisahkan oleh,). Kelemahan dari solusi ini adalah bahwa setiap tampilan akan memerlukan konfigurasi ini.
nenne
Saya menemukan masalah untuk pandangan yang berhubungan dengan masalah ini, juga merujuk pada cara yang tepat untuk menyelesaikan masalah: drupal.org/node/1266388 .
nenne
2
Jika Anda dapat menulis jawaban tentang cara mengatasi masalah, itu bisa diterima; seperti kata merlinofchaos, modul Views memuat node menggunakan query database, dan itulah alasan mengapa hook_node_access()implementasi tidak dihormati. Karena "sesuai desain," melaporkan penyelesaian tidak masalah.
kiamlaluno

Jawaban:

6

Saya punya pertanyaan yang sama beberapa waktu lalu di sini .

hook_node_accesstidak diakui oleh viewsatau menus. Seharusnya hanya digunakan sebagai garis pertahanan terakhir.

Cara yang lebih baik untuk mengontrol akses node adalah melalui hook_node_access_recordsdan hook_node_grantsseperti yang dijelaskan di sini dan di sini .

Baba
sumber
1

Tampilan menggunakan SQL menentukan node untuk ditampilkan. Sayangnya, untuk alasan kinerja, tidak mungkin layak bagi Drupal untuk melakukan node_load pada semua kandidat potensial dan kemudian memanggil hook_node_access pada masing-masing dari mereka semua. Bayangkan sebuah tampilan yang menunjukkan ribuan node (terutama ketika menggunakan pager). Jika logika tidak dilakukan dalam SQL maka pager akan memiliki fungsionalitas yang sangat tidak biasa sehingga memaksa Drupal Anda melakukannya seperti yang disebutkan menggunakan catatan akses dalam database Anda.

Membuat access_records adalah pekerjaan yang cukup banyak tetapi akan membuatnya bekerja dengan SQL. Jadi saya sarankan menggunakan modul node_access yang ada untuk menyelesaikan fungsionalitas Anda sedapat mungkin karena mungkin akan diimplementasikan menggunakan catatan akses dan dengan demikian akan bekerja dengan tampilan.

Omong-omong catatan akses disimpan dalam tabel node_access tabel seperti yang terlihat di bawah ini: masukkan deskripsi gambar di sini Melalui komentar untuk setiap kolom Anda bisa mendapatkan pemahaman tentang tujuan mereka. Pikirkan ranah sebagai sistem yang digunakan untuk akses node dan gid sebagai grup dalam ranah. Grup itu dapat memiliki melihat, memperbarui, dan menghapus izin. Secara umum setiap modul node_access mendefinisikan satu atau lebih ranah (terkadang beberapa modul node_access juga dapat bekerja secara paralel). Seorang pengguna memiliki satu atau lebih gid di setiap bidang.

Di Drupal, semua kueri yang memiliki tag "node_access" secara otomatis akan menambahkan beberapa logika khusus. Lihat dokumentasi untuk mempelajari lebih lanjut tentang pemberian tag. Logika khusus ini bergabung dengan tabel "node_access" untuk setiap bidang dan menambahkan kondisi di mana "gid" sama dengan salah satu gids yang diterapkan pada pengguna, pengguna memiliki izin yang sesuai.

Seluruh sistem ini memungkinkan semua permintaan untuk menangani dengan benar node_access, bahkan menghitung permintaan, dll. Ini sangat kuat tetapi memiliki kurva belajar yang lebih tinggi yang hanya dengan hook_node_access sederhana. Kapan pun memungkinkan, menggunakan modul node_access yang ada dapat menghemat seluruh sakit kepala ini.

Thomas4019
sumber