模块如何检测输出“访问拒绝”页面? -- 7 领域 drupal 相关 的问题

How can a module detect when the “access denied” page is output?


16
vote

问题

中文

模块如何检测Drupal输出"访问被拒绝" 页面时?
我知道如何用Drupal 6来做;我需要知道如何用Drupal 7进行。

英文原文

How is it possible for a module to detect when Drupal is outputting the "access denied" page?
I know how to do it with Drupal 6; I need to know how to do it with Drupal 7.

  

回答列表

13
 
vote

您可以在403&amp时设置显示哪些页面;发生404错误(管理/设置/错误报告)。

我猜你可以在 99887666 中添加一个新页面,然后将此页面设置为403错误回调。当您的自定义菜单回调时,您知道您正在输出"访问被拒绝" 页面!

 

You can set which pages are displayed when 403 & 404 errors occurs (admin/settings/error-reporting).

I guess you can add a new page in your hook_menu(), then set this page as the 403 error callback. When your custom menu callback is hit, you know you're outputting the "access denied" page!

 
 
 
 
12
 
vote

我在boost 7.x中这样做。这不漂亮,但它确实完成了工作。

  • hook_page_delivery_callback_alter()
  • boost_page_delivery_callback_alter()
  • boost_deliver_html_page()
  function boost_page_delivery_callback_alter(&$callback, $set = FALSE) {   if ($callback == 'drupal_deliver_html_page') {     $callback = 'boost_deliver_html_page';   } }  function boost_deliver_html_page($page_callback_result) {   global $_boost;    // Menu status constants are integers; page content is a string or array.   if (is_int($page_callback_result)) {     // @todo: Break these up into separate functions?     switch ($page_callback_result) {        // …        case MENU_ACCESS_DENIED:         // 403 page.         $_boost['menu_item']['status'] = 403;         break;        // …      }     // …   }   // …    }   
 

I do this in Boost 7.x. It's not pretty, but it does get the job done.

  • hook_page_delivery_callback_alter()
  • boost_page_delivery_callback_alter()
  • boost_deliver_html_page()
function boost_page_delivery_callback_alter(&$callback, $set = FALSE) {   if ($callback == 'drupal_deliver_html_page') {     $callback = 'boost_deliver_html_page';   } }  function boost_deliver_html_page($page_callback_result) {   global $_boost;    // Menu status constants are integers; page content is a string or array.   if (is_int($page_callback_result)) {     // @todo: Break these up into separate functions?     switch ($page_callback_result) {        // xe2x80xa6        case MENU_ACCESS_DENIED:         // 403 page.         $_boost['menu_item']['status'] = 403;         break;        // xe2x80xa6      }     // xe2x80xa6   }   // xe2x80xa6    } 
 
 
 
 
10
 
vote
vote
最佳答案
 

在drupal 7中,返回已设置的http标头的函数是 drupal_get_http_header(),它需要HTTP标头名称为参数。 看着 authorize_access_denied_pa​​ge()和 drupal_fast_404()代码可以清除哪个值传递给该函数。

    // authorize_access_denied_page()   drupal_add_http_header('Status', '403 Forbidden');   watchdog('access denied', 'authorize.php', NULL, WATCHDOG_WARNING);   drupal_set_title('Access denied');   return t('You are not allowed to access this page.');   
  // drupal_fast_404() if ($fast_paths && preg_match($fast_paths, $_GET['q'])) {   drupal_add_http_header('Status', '404 Not Found');   $fast_404_html = variable_get('404_fast_html', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>');   // Replace @path in the variable with the page path.   print strtr($fast_404_html, array('@path' => check_plain(request_uri())));   exit; }   

当"状态" 标题以 403 开始时,然后Drupal输出访问拒绝页面。

确保呼叫<代码> drupal_get_http_header('Status') 迟到了。 hook_init() 在期间调用,但在 99887664期间调用它(或任何主题预处理钩)将具有更新的头信息。

 

In Drupal 7, the function that returns the already set HTTP headers is drupal_get_http_header(), which requires the HTTP header name as parameter. Looking at authorize_access_denied_page(), and drupal_fast_404() code makes clear which values to pass to that function.

  // authorize_access_denied_page()   drupal_add_http_header('Status', '403 Forbidden');   watchdog('access denied', 'authorize.php', NULL, WATCHDOG_WARNING);   drupal_set_title('Access denied');   return t('You are not allowed to access this page.'); 
// drupal_fast_404() if ($fast_paths && preg_match($fast_paths, $_GET['q'])) {   drupal_add_http_header('Status', '404 Not Found');   $fast_404_html = variable_get('404_fast_html', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>');   // Replace @path in the variable with the page path.   print strtr($fast_404_html, array('@path' => check_plain(request_uri())));   exit; } 

When the "Status" header starts with 403, then Drupal output an access denied page.

Make sure the call to drupal_get_http_header('Status') happens late. Calling during hook_init() is too soon, but calling it during hook_page_alter() (or any theme preprocess hook) will have the updated header information.

 
 
 
 
4
 
vote

您的模块可以拦截由页面" 99887666 " 修改的" Default 403 (access denied) page " 值的值:

  1. hook_enable 中,使用 variable_get / variable_set 将现有值复制到辅助变量替换您自己的路径的变量(您使用 // drupal_fast_404() if ($fast_paths && preg_match($fast_paths, $_GET['q'])) { drupal_add_http_header('Status', '404 Not Found'); $fast_404_html = variable_get('404_fast_html', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>'); // Replace @path in the variable with the page path. print strtr($fast_404_html, array('@path' => check_plain(request_uri()))); exit; } 0 )。

  2. 使用 // drupal_fast_404() if ($fast_paths && preg_match($fast_paths, $_GET['q'])) { drupal_add_http_header('Status', '404 Not Found'); $fast_404_html = variable_get('404_fast_html', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>'); // Replace @path in the variable with the page path. print strtr($fast_404_html, array('@path' => check_plain(request_uri()))); exit; } 1 更改"错误报告" 表单以读取从/写入次要变量

  3. 如果您希望对用户完全看不见,您的页面回调可以调用 // drupal_fast_404() if ($fast_paths && preg_match($fast_paths, $_GET['q'])) { drupal_add_http_header('Status', '404 Not Found'); $fast_404_html = variable_get('404_fast_html', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>'); // Replace @path in the variable with the page path. print strtr($fast_404_html, array('@path' => check_plain(request_uri()))); exit; } 2

  4. // drupal_fast_404() if ($fast_paths && preg_match($fast_paths, $_GET['q'])) { drupal_add_http_header('Status', '404 Not Found'); $fast_404_html = variable_get('404_fast_html', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>'); // Replace @path in the variable with the page path. print strtr($fast_404_html, array('@path' => check_plain(request_uri()))); exit; } 3 中,恢复来自次级变量的值


就是这样,当触发"访问被拒绝" 时,您的模块以清洁的方式(并且是用户不可见的)。

 

Your module could intercept the value of "Default 403 (access denied) page" which is modified by the page "Administer > Site configuration > Error reporting":

  1. In hook_enable, using variable_get/variable_set, copy the existing value to a secondary variable and replace the variable by your own path (which you registered using hook_menu).

  2. alter the "Error reporting" form using hook_form_FORM_ID_alter to read from/write to the secondary variable

  3. If you want to be completely invisible to the user, your page callback to could call drupal_goto( the_value_of_the_secondary_variable ).

  4. In hook_disable, restore the value from the secondary variable.


And that's it, your module gets notified in a clean way (and invisible to the user) when "Access denied" is triggered.

 
 
2
 
vote
肯定是您可以使用PHP的 // drupal_fast_404() if ($fast_paths && preg_match($fast_paths, $_GET['q'])) { drupal_add_http_header('Status', '404 Not Found'); $fast_404_html = variable_get('404_fast_html', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>'); // Replace @path in the variable with the page path. print strtr($fast_404_html, array('@path' => check_plain(request_uri()))); exit; } 4 功能?

http://php.net/manual/en/function.get-标题.php

返回的数组中的第一个元素将是响应代码。如果它包含'403',则Drupal返回"访问被拒绝" 页面。

我不确定哪个叫它的最佳地点。可能 // drupal_fast_404() if ($fast_paths && preg_match($fast_paths, $_GET['q'])) { drupal_add_http_header('Status', '404 Not Found'); $fast_404_html = variable_get('404_fast_html', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>'); // Replace @path in the variable with the page path. print strtr($fast_404_html, array('@path' => check_plain(request_uri()))); exit; } 5 ,具体取决于您的需求:

http:// api。 drupal.org/api/dri/developer--hooks--core.php/function/hook_exit/6

 

Surely you could use PHP's get_headers() function?

http://php.net/manual/en/function.get-headers.php

The first element in the array returned will be the response code. If it contains '403' then Drupal returned an "access denied" page.

I'm not sure where the best place to call it would be. Probably hook_exit(), depending on your needs:

http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_exit/6

 
 
2
 
vote

这是检测拒绝访问(403)和未找到的页面(404)在Drupal 7中的最简单方法。

  // drupal_fast_404() if ($fast_paths && preg_match($fast_paths, $_GET['q'])) {   drupal_add_http_header('Status', '404 Not Found');   $fast_404_html = variable_get('404_fast_html', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>');   // Replace @path in the variable with the page path.   print strtr($fast_404_html, array('@path' => check_plain(request_uri())));   exit; } 6  
 

This is the simplest way to detect Access Denied (403) and Page Not Found (404) in Drupal 7.

// get the menu router item for the current page $router_item = menu_get_item();  // if there is no router item, this page is not found $is_page_not_found_404 = empty($router_item);  // if 'access' is empty for the router item, access is denied $is_access_denied_403 = empty($router_item['access']); 
 
 
-2
 
vote

您可以使用面板模块。

面板模块允许站点管理员为多个用途创建自定义布局。它的核心它是一个拖放内容管理器,它可以让您在视觉上设计布局并将内容放在该布局中。与其他系统的集成允许您创建使用此的节点,使用此且甚至覆盖分类系统页面等系统页面,以便您可以使用非常精细的粗大权限自定义您的网站的布局。

 

You can use the Panels module for this.

The Panels module allows a site administrator to create customized layouts for multiple uses. At its core it is a drag and drop content manager that lets you visually design a layout and place content within that layout. Integration with other systems allows you to create nodes that use this, landing pages that use this, and even override system pages such as taxonomy and the node page so that you can customize the layout of your site with very fine grained permissions.

 
 

相关问题

3  如何自动突出显示页面上显示的代码的语法?  ( How to automatically highlight syntax of code displayed on page ) 
我正在开发一个网站,用于从不同的编程语言发布我的代码。我想突出用不同颜色的代码语法。但是,手动这样做是耗时的。 是否有任何模块或方法可以自动执行此操作?严格,它应该以CSS方式完成。 ...

1  自定义SQL:NodeReference Joins和最新视频  ( Custom sql nodereference joins and latest vid ) 
我有一个构成自定义SQL查询的时间。 查询有多个Nodereference,需要返回最新的节点修订版。 我理解得很好,但由于某种原因,返回最新版本的额外复杂性正在绊倒我。 我宁愿通过创建视图并以编程方式执行它们,仅仅因为 WHERE 条款的复杂性,就会以编程方式执行它们。 我已经尝试翻译等同的视图的输出,但是对视图粘...

7  如何创建“逐步处理”内容类型?  ( How might i create a step by step process content type ) 
我正在考虑为Intranet创建一个过程手册。大多数(全部?)的流程都有一个非常明确的订单,尽管实际顺序可能不时改变。该计划是有主题专家,可能是六十多个左右,输入和更新流程页面。该网站的用户需要能够在与客户交互时快速审查流程,通常面对面。 这是我想到的选项: 培训作者使用有序列表。 pro:最容易的。康科:依靠培...

20  如何使用带有自定义表的数据与寻呼机进行排序表?  ( How do you make sortable tables with a pager with data from a custom table ) 
对于Drupal 6,您可以做到这样的事情: $header = array( array('data' => t('Order id'), 'field' => 'order_id'), ... array('data' => t('Transaction time'), 'field' => 'p...

148  推荐的目录权限是什么?  ( What are the recommended directory permissions ) 
我正在努力部署drupal 7站点,我找不到关于建议的安全有效文件和目录权限的任何文档。 特别是 default/files/ (也是子目录?), settings.php , .htaccess 以及其他任何我应该知道的。 ...

5  从Drupal表单字段/标签中删除冒号  ( Remove colons from drupal form fields labels ) 
如何删除:从使用Drupal形式API制作的表单后出现: ...

5  主题Drupal表单API复选框作为网格  ( Theme drupal form api checkboxes as a grid ) 
我有一个自定义表单,显示大约2多个复选框的表单元素。如果可能,我想在表中每行输出3个。我怎么能做到这一点? $form['preference'] = array( '#type' => 'checkboxes', '#default_value' => 1373, '#require...

2  如何表示用户作为“系统帐户”?  ( How to denote a user as a system account ) 
在Unix世界中,有"用户帐户" 用于人类使用,并且有软件使用"系统帐户" 。 在一个drupal站点上,我有几个系统账户旨在通过 services.module API呼叫使用。 我希望这些帐户能够通过服务API(显然)登录,但我想阻止这些帐户通过标准 99887665 表单来登录。我还想防止这些帐户在标准的"活...

7  我可以改变调用不同模块的挂钩实现的顺序吗?  ( Can i change the order in which hook implementation by different modules are cal ) 
在D6中,我使用opply模块,但我想覆盖一小部分其行为。我有一个自定义模块,但我在Contract模块的实现之前调用了相关钩子的实现,因此Contract模块的版本"WINS" 。 有没有办法改变它,并强迫我自己的钩子呼叫? 以下是具体细节: 我想在评论表单中删除未注册用户的默认"匿名" 用户名。我创建了一个小...

7  如何在地图上有非确切的位置?  ( How can i have non exact locations on a map ) 
我正在使用gmap帮助用户在他们的地区找到其他人。但我想让用户拥有一些隐私,只能在地图中提供他们的城市和邮政编码,但仍然有数据库中的完整地址以用于邮寄。我怎样才能做到这一点? PIN在地图上的位置也应该仅基于城市和拉链,显然它可能是最精确的位置。 例如,让我们说总统在我们的网站上注册。他进入了他的完整地址,1600宾...

13  Drupal 7和Pagespeed  ( Drupal 7 and pagespeed ) 
apache模块 pagespeed 为html,javascript等提供各种优化,这很好。< / p> 但是,它的一些功能与Drupal自己的聚合和优化方法是多余的。因此,有人测试哪些过滤器对典型的Drupal 7网站有用,由于Drupal已经为其提供支持而无用? ...

8  如何创建批量节点创建界面?  ( How can i create a bulk node creation interface ) 
我有一个接口的请求,其中能够在一个屏幕上批量创建具有少量所需字段的节点(例如,标题,日期和节点引用)。 我想象一些可编辑表视图/网格,每个行代表单个节点。 实现这样的东西的最佳方法是什么? ...

7  如何使用CDN自动提供Drupal 7的静态内容?  ( How to automatically deliver drupal 7s static contents using cdns ) 
我使用"Rackspace云文件" 服务作为我的CDN(内容传送网络)。此服务为许多与CDN相关的自动化提供了很好的API。请帮助我与Rackspace云文件集成Drupal。我甚至不想手动将静态内容复制到CDN。 ...

2  如何提供带有Node调用的上下文/ NID的过滤器?  ( How can i provide a filter with context nid of node invoking ) 
我目前正在处理具有一个过滤器的自定义模块,该过滤器需要输出的节点对象。 最初过滤器只需从arg(1)中的niD中拉动NID,并在节点对象中使用该滤波器,但不幸的是,如果滤波器缓存被刷新,并且节点重建从节点页面本身以外的任何位置重建其输出(1)不会包含NID,因此过滤器将破坏。 我正在考虑将nid放入令牌转换的令牌,但...

1  允许第三方模块更改模块执行的查询  ( Allowing third party modules to alter the query executed by a module ) 
我正在开发一个暴露公共API的模块,该模块包括在他自己的数据库表中保存数据的函数,它应该从使用我的模块的任何模块中使用。 模块检查数据库的内容,以验证用户是否不允许访问该站点,或者如果在其用户配置文件中更改某些内容时应使用错误消息通知用户。 考虑到在大多数情况下,数据库表是唯一要检查的表,如果我更改代码以允许第三方模...

2  Drupal缓存可防止饼干阅读  ( Drupal caching prevents cookie read ) 
在我的一个生产网站上,我写了一个jQuery样式表切换器。当制作选择并使用PHP时,它会丢弃Cookie,以在覆盖样式的Pageload上选择相应的样式表。一切都很棒,直到我启用性能缓存模式,在每个Pageload上都会忽略cookie。显然,这不是所需的效果,我可以看到为什么这是出现的:是页面被缓存,并且不再真正动...

13  构建视图过滤器  ( Building a views filter ) 
我想为我构建的自定义模块构建过滤器,并与视图集成。实质上,该模块允许您定义不同节点之间的关系类型。我想为此创建一个过滤器,以便我可以显示某种关系的节点。 我找不到任何描述过滤器更详细地描述过滤器的文档,并向它们解释各个部分。在这方面,API文档是可怕的。 任何人都可以在详细建筑视图过滤器上建立一个很好的资源/文章? ...

20  如何实现双向节点引用?  ( How do i implement two way node references ) 
节点参考模块(CCK的组件)提供了从另一个创建引用一个节点的重要方法。揭露两者之间双向关系的最佳方式是什么?例子如下: 例如,在具有两张票据(节点)A&amp的票式跟踪系统中; b,您可以从票证a - &gt创建节点参考。 b和标记b作为孩子。查看票证时,显示此信息将是微不足道的。但是,当查看票证B时,我还想显示这...

17  如何创建钩子?  ( How to create a hook ) 
如何为其他Drupal模块创建自己的钩子(类似于Drupal Core创建)使用? ...

1  Drupal如何确定显示管理主题的上下文?  ( How does drupal determine the context in which to display the admin theme ) 
Drupal 7的伟大事物之一是包含管理主题七个。但Drupal如何确定是否显示管理主题,或显示网站的主题? 是基于路径的(即,在 admin )中的所有内容? ...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.