hook_node_access를 고려한보기


14

hook_node_access()사용자 정의 기준에 따라 사용자가 일부 노드에 대한 액세스를 거부 하는 데 사용 하고 있습니다. 그러나 사용자가 기준을 통과하지 않으면이 내용을 표시하는보기 에이 내용을 표시하고 싶지 않습니다. hook_node_access()구현을 존중 하는 견해를 가질 수있는 방법이 있습니까?


Views 모듈이로 설정된 액세스 권한을 실제로 존중하지 않으면 hook_node_access()Views 모듈 코드를 변경하기 위해 수행해야 할 작업이 있습니다.
kiamlaluno

노드가 실제로 node_load와 함께 전체적으로로드 될 때까지 후크가 시작된다고 생각하지 않으므로 아마도 여전히 나타납니다. 그러나 hook_node_access () 구현이 사람들을 잠그는 데 사용하는 것과 동일한 방법을 사용하는 필터 플러그인 작업을 시작했습니다. 필자는 모든 뷰에서 해당 필터를 추가해야한다는 것을 기억해야하며 작동해야합니다. 다른 사람들이 혜택을 볼 수 있도록 정보가 담긴 여기로 돌아옵니다.
nenne

좋아, 그래서 나의 유스 케이스는 다음과 같습니다. 고객은 모든 노드에 적용 가능한 10 레벨의 액세스를 원하며 사용자는 모든 노드가 자신의 액세스 레벨을 볼 수 있어야합니다. 이것은 표준 노드 뷰를 위해 hook_node_access를 통해 쉽게 해결되었습니다. 그러나보기가 이것을 존중하지 않기 때문에 인수에 대한 사용자 정의 PHP 코드로 컨텍스트 필터를 만들었습니다. PHP 코드는 기본적으로 사용자 액세스 수준에 대해 낮거나 같은 값을 반환했습니다 (,로 구분 된 적절한 구문). 이 솔루션의 단점은 모든 뷰에이 구성이 필요하다는 것입니다.
nenne

이 문제를 다루는 견해에 대한 문제를 발견했으며 drupal.org/node/1266388 과 같은 문제를 해결하는 올바른 방법을 나타냅니다 .
nenne

2
문제를 해결하는 방법에 대한 답변을 작성할 수 있다면, 그것은 완벽하게 수용 가능합니다. merlinofchaos가 말했듯이 Views 모듈은 데이터베이스 쿼리를 사용하여 노드를로드하고 hook_node_access()있으며 이것이 구현이 존중되지 않는 이유 입니다. "설계 상"이므로 해결 방법을보고하는 것이 좋습니다.
kiamlaluno

답변:


6

나는 전에 동안 같은 질문 a를 가지고 여기에 .

hook_node_accessviews또는로 인식되지 않습니다 menus. 최후의 방어선으로 만 사용해야합니다.

제어 노드에 액세스 할 수있는 더 좋은 방법을 통해입니다 hook_node_access_recordshook_node_grants같이 설명 여기여기 .



1

뷰는 SQL을 사용하여 표시 할 노드를 결정합니다. 안타깝게도, 성능상의 이유로 Drupal이 모든 잠재적 후보에 대해 node_load를 수행 한 후 각각의 후보에 대해 hook_node_access를 호출하는 것은 실현 가능하지 않습니다. 수천 개의 노드 (특히 호출기를 사용할 때)를 보여주는 뷰를 상상해보십시오. 논리가 SQL에서 수행되지 않으면 호출기는 매우 특이한 기능을 가지므로 Drupal은 데이터베이스에서 액세스 레코드를 사용하여 언급 한 것처럼 Drupal에서 강제로 수행합니다.

access_records를 만드는 것은 상당히 많은 작업이지만 SQL에서 작동하게합니다. 따라서 액세스 레코드를 사용하여 구현되어 뷰와 함께 작동하므로 가능한 경우 항상 기존 node_access 모듈을 사용하여 기능을 해결하는 것이 좋습니다.

그런데 액세스 레코드가 아래에 표시된 것처럼 node_access 테이블에 저장 됩니다. 여기에 이미지 설명을 입력하십시오 각 열의 주석을 통해 목적을 이해할 수 있습니다. 영역을 노드 액세스에 사용되는 시스템으로, gid를 영역 내의 그룹으로 생각하십시오. 해당 그룹은보기, 업데이트 및 삭제 권한을 가질 수 있습니다. 일반적으로 각 node_access 모듈은 하나 이상의 영역을 정의합니다 (때로는 여러 개의 node_access 모듈도 병렬로 작동 할 수 있음). 사용자는 각 영역에 하나 이상의 gid가 있습니다.

Drupal에서 "node_access"태그가있는 모든 쿼리에는 자동으로 몇 가지 특수 로직이 추가됩니다. 태그 지정에 대한 자세한 내용은 설명서 를 참조하십시오 . 이 특수 로직은 각 영역에 대해 "node_access"테이블을 조인하고 "gid"가 사용자에게 적용된 gid 중 하나와 동일한 경우 사용자에게 적절한 권한이 있다는 조건을 추가합니다.

이 전체 시스템을 통해 모든 쿼리가 node_access, 심지어 쿼리 수 등을 올바르게 처리 할 수 ​​있습니다. 매우 강력하지만 단순한 hook_node_access에 비해 학습 곡선이 높습니다. 가능하면 기존 node_access 모듈을 사용하면이 전체 두통을 줄일 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.