[development] Getting Around The Limitations of hook_db_rewrite_sql

Rob Thorne rob at torenware.com
Mon Apr 3 07:13:44 UTC 2006


I'm writing a module for 4.7 that needs to control access to nodes that 
are only viewable by users who are approved via an external module.  To 
determine if a node is viewable,  I need to check the user *and* the 
node id.  This would work, except for a design decision that was made 
"for performance".  Here's what it says in the docs, in the article 
about "Node access rights" 
(http://api.drupal.org/api/HEAD/group/node_access):

    In node listings, the process above is followed except that
    hook_access <http://api.drupal.org/api/HEAD/function/hook_access>()
    is not called on each node for performance reasons and for proper
    functioning of the pager system. When adding a node listing to your
    module, be sure to use db_rewrite_sql
    <http://api.drupal.org/api/HEAD/function/db_rewrite_sql>() to add
    the appropriate clauses to your query for access checks.

In other words, even if you set up your hook_access to prohibit viewing 
of your content, Drupal 4.7 *will display your private content to an 
anonymous user*.  Once your private node gets added to the list, there 
are no further checks to your hook access to determine if your node is 
safe to display.   I don't see any way that hook_db_rewrite_sql can be 
used for this purpose, since there is no simple relationship between the 
current user and whether a node should be viewable, short of doing one 
of the following things:

    * I could use a IN ()  clause to list every node id of the given
      type that the given user is allowed to see.  This may work in my
      current situation, but there can easily be *thousands* of these in
      some applications.  So this is not a general solution.
    * I could manipulate the node_access table *on the fly* each time a
      user with some access to the content type.
    * I could  somehow  hack the  node to hide  itself by not
      displaying  any sensitive content in hook_view, and theming it to
      be hidden via CSS.

<rant>
IMNHO, this is complete insane.
</rant>

What's the best way to get around this, um, performance enhancement?

Thanks,
Rob

It may help improve


More information about the development mailing list