Có lượt xem tôn trọng hook_node_access


14

Tôi đang sử dụng hook_node_access()để từ chối người dùng truy cập vào một số nút dựa trên một tiêu chí tùy chỉnh. Tuy nhiên, tôi không muốn nội dung này hiển thị trong chế độ xem liệt kê nội dung đó nếu người dùng không vượt qua tiêu chí. Có cách nào để có quan điểm tôn trọng hook_node_access()việc thực hiện?


Nếu mô-đun Lượt xem không thực sự tôn trọng quyền truy cập được đặt hook_node_access(), thì chỉ cần thực hiện một điều: thay đổi mã mô-đun Lượt xem.
kiamlaluno

Tôi không nghĩ rằng hook được kích hoạt cho đến khi nút thực sự được tải toàn bộ với node_load vì vậy đó có thể là lý do tại sao nó vẫn xuất hiện. Tuy nhiên, tôi đã bắt đầu làm việc với một plugin bộ lọc sẽ sử dụng cùng một phương thức để lọc mà việc triển khai hook_node_access () sử dụng để khóa mọi người. Tôi sẽ chỉ cần nhớ để thêm bộ lọc đó trong tất cả các chế độ xem của tôi và nó sẽ hoạt động. Tôi sẽ quay lại đây với thông tin về nó sau khi tôi hoàn thành để những người khác có thể làm lợi.
nenne

Ok, vì vậy trường hợp sử dụng của tôi là thế này: Khách hàng muốn 10 cấp độ truy cập có thể áp dụng cho bất kỳ nút nào và người dùng sẽ có thể thấy tất cả các nút dưới mức truy cập của họ. Điều này đã được giải quyết dễ dàng thông qua hook_node_access cho chế độ xem nút tiêu chuẩn. Tuy nhiên, vì các khung nhìn không tôn trọng điều này nên tôi đã tạo một bộ lọc theo ngữ cảnh với mã php tùy chỉnh cho đối số. Mã php về cơ bản trả về các giá trị thấp hơn hoặc bằng cho mức truy cập của người dùng (theo cú pháp thích hợp được phân tách bởi,). Hạn chế của giải pháp này là mọi chế độ xem sẽ cần cấu hình này.
nenne

Tôi tìm thấy một vấn đề cho các quan điểm liên quan đến vấn đề này, nó cũng đề cập đến một cách giải quyết vấn đề thích hợp: drupal.org/node/1266388 .
nenne

2
Nếu bạn có thể viết một câu trả lời về cách giải quyết vấn đề, điều đó là hoàn toàn chấp nhận được; như merlinofchaos nói, mô-đun Views đang tải các nút bằng cách sử dụng truy vấn cơ sở dữ liệu và đó là lý do tại sao hook_node_access()việc triển khai không được tôn trọng. Vì nó là "theo thiết kế", báo cáo một công việc xung quanh là tốt.
kiamlaluno

Câu trả lời:


6

Tôi đã có cùng một câu hỏi một thời gian trước đây ở đây .

hook_node_accesskhông được công nhận bởi viewshoặc menus. Nó chỉ nên được sử dụng như là tuyến phòng thủ cuối cùng.

Một cách tốt hơn để kiểm soát truy cập nút là thông qua hook_node_access_recordshook_node_grantsnhư được mô tả ở đâyở đây .



1

Lượt xem sử dụng SQL xác định các nút để hiển thị. Đáng buồn thay, vì lý do hiệu suất, đơn giản là không khả thi khi Drupal thực hiện một nút_load trên tất cả các ứng cử viên tiềm năng và sau đó gọi hook_node_access trên mỗi một trong số họ. Hãy tưởng tượng một khung nhìn hiển thị hàng ngàn nút (đặc biệt là khi sử dụng máy nhắn tin). Nếu logic không được thực hiện trong SQL thì máy nhắn tin sẽ có chức năng rất bất thường, do đó, Drupal buộc bạn làm điều đó như rik đã đề cập bằng cách sử dụng các bản ghi truy cập trong cơ sở dữ liệu của bạn.

Tạo access_records là một công việc hợp lý hơn nhưng sẽ làm cho nó hoạt động với SQL. Do đó, tôi khuyên bạn nên sử dụng mô-đun node_access hiện có để giải quyết chức năng của mình bất cứ khi nào có thể bởi vì nó có thể sẽ được triển khai bằng các bản ghi truy cập và do đó sẽ hoạt động với các khung nhìn.

Bằng cách này, các bản ghi truy cập được lưu trữ trong bảng node_access như bảng dưới đây: nhập mô tả hình ảnh ở đây Thông qua các nhận xét cho mỗi cột, bạn có thể hiểu được mục đích của chúng. Hãy nghĩ về vương quốc như hệ thống được sử dụng để truy cập nút và gid là nhóm trong một lĩnh vực. Nhóm đó có thể có quyền xem, cập nhật và xóa quyền. Nói chung, mỗi mô-đun node_access xác định một hoặc nhiều cảnh giới (đôi khi nhiều mô-đun node_access cũng có thể hoạt động song song). Một người dùng có một hoặc nhiều gids trong mỗi cõi.

Trong Drupal, tất cả các truy vấn có thẻ "node_access" sẽ tự động được thêm một số logic đặc biệt. Xem tài liệu để tìm hiểu thêm về gắn thẻ. Logic đặc biệt này tham gia bảng "node_access" cho mỗi vương quốc và thêm điều kiện trong đó "gid" bằng với một trong các gids được áp dụng cho người dùng, người dùng có quyền thích hợp.

Toàn bộ hệ thống này cho phép tất cả các truy vấn xử lý đúng cách node_access, thậm chí đếm các truy vấn, v.v ... Nó rất mạnh nhưng có đường cong học tập cao hơn chỉ bằng hook_node_access đơn giản. Bất cứ khi nào có thể, sử dụng mô-đun node_access hiện có có thể giúp bạn đỡ đau đầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.