As exibições respeitam hook_node_access

14

Estou usando hook_node_access()para negar aos usuários acesso a alguns nós com base em critérios personalizados. No entanto, não quero que esse conteúdo seja exibido em uma exibição que a lista se o usuário não passar nos critérios. Existe alguma maneira de ter visualizações respeitando hook_node_access()implementações?

nenne
fonte
Se o módulo Views realmente não respeitar a permissão de acesso definida hook_node_access(), basta executar uma ação: alterar o código do módulo Views.
kiamlaluno
Eu não acho que esse gancho seja acionado até que o nó seja realmente carregado na íntegra com o node_load, então é provavelmente por isso que ele ainda aparece. No entanto, comecei a trabalhar em um plug-in de filtro que usará o mesmo método para filtrar que a implementação de hook_node_access () usa para bloquear as pessoas. Vou ter que lembrar de adicionar esse filtro em todas as minhas visualizações e deve funcionar. Voltarei aqui com informações quando terminar, para que outros possam se beneficiar.
Nenne
Ok, então meu caso de uso foi o seguinte: o cliente deseja 10 níveis de acesso aplicáveis ​​a qualquer nó e os usuários devem poder ver todos os nós abaixo do nível de acesso. Isso foi facilmente resolvido via hook_node_access para a visualização padrão do nó. No entanto, como as visualizações não respeitavam isso, criei um filtro contextual com código php personalizado para o argumento. O código php basicamente retornou valores inferiores ou iguais ao nível de acesso dos usuários (na sintaxe apropriada, separada por,). A desvantagem desta solução é que todas as visualizações precisarão dessa configuração.
Nenne 22/02/12
Encontrei um problema para visualizações que lida com esse problema, mas também se refere a uma maneira adequada de resolver o problema: drupal.org/node/1266388 .
Nenne 22/02/12
2
Se você pode escrever uma resposta sobre como resolver o problema, isso é perfeitamente aceitável; como merlinofchaos diz, o módulo Views está carregando os nós usando uma consulta ao banco de dados, e é por isso que as hook_node_access()implementações não são respeitadas. Como é "por design", relatar uma solução alternativa é bom.
kiamlaluno

Respostas:

6

Eu tive a mesma pergunta há um tempo aqui .

hook_node_accessnão é reconhecido por viewsou menus. Só deve ser usado como a última linha de defesa.

Uma maneira melhor de controlar o acesso ao nó é através hook_node_access_recordse hook_node_grantsconforme descrito aqui e aqui .

Baba
fonte
1

O Views usa SQL determina os nós a serem exibidos. Infelizmente, por razões de desempenho, simplesmente não seria viável para o Drupal executar uma carga de nó em todos os possíveis candidatos e, em seguida, chamar hook_node_access em cada um deles. Imagine uma exibição que mostre milhares de nós (especialmente ao usar um pager). Se a lógica não for feita no SQL, os pagers teriam uma funcionalidade muito incomum, portanto, o Drupal o força a fazê-lo como o rik mencionado, usando registros de acesso em seu banco de dados.

Tornar access_records é uma quantidade razoável de trabalho, mas fará com que funcione com o SQL. Portanto, recomendo usar um módulo node_access existente para resolver sua funcionalidade sempre que possível, porque provavelmente será implementado usando registros de acesso e, portanto, funcionará com visualizações.

A propósito, os registros de acesso são armazenados na tabela node_access, conforme mostrado abaixo: insira a descrição da imagem aqui Através dos comentários de cada coluna, você pode entender o propósito deles. Pense na região como o sistema usado para acesso ao nó e o gid como o grupo em uma região. Esse grupo pode ter permissões de visualização, atualização e exclusão. Em geral, cada módulo node_access define uma ou mais regiões (às vezes vários módulos node_access também podem funcionar em paralelo). Um usuário tem um ou mais gids em cada uma das regiões.

No Drupal, todas as consultas que possuem a tag "node_access" terão automaticamente alguma lógica especial adicionada. Consulte a documentação para saber mais sobre a marcação. Essa lógica especial une a tabela "node_access" para cada região e adiciona a condição de que onde o "gid" é igual a um dos gids aplicados a um usuário, o usuário tem a permissão apropriada.

Todo esse sistema permite que todas as consultas gerenciem adequadamente o node_access, contem consultas, etc. É muito poderoso, mas possui uma curva de aprendizado mais alta que apenas o hook_node_access simples. Sempre que possível, o uso de um módulo node_access existente pode economizar toda essa dor de cabeça.

Thomas4019
fonte