通过代码身份验证编辑节点 -- 7 领域 drupal 相关 的问题

Edit a node via code authentication


2
vote

问题

中文

我正在创建一个网站,我必须为匿名用户提供更新节点的可能性。通过使用代码来识别该节点,当第一次保存节点时,我向用户发送到用户的代码。当我保存此节点(第一次)时,将修改节点以确保它由用户X拥有而不是匿名。好的,有点复杂,但这些是我客户的请求。

所以,我向用户发送邮件,将此行发送到: http:// dominio。 Ext / node / 123 /编辑/ codesha1 。

我的问题是,Drupal显然告诉我,拒绝访问的访问来执行编辑操作(节点UID是x,但我是UID 0)当我点击该链接时(在我的电子邮件客户端中)。

如何解决这个"问题" ?我不想安装tac或taclite,但我可以将php代码写入我的自定义模块之一。

英文原文

I'm creating a website and I have to give the possibility for an anonymous user to update a node. The node is recognized through the use of a code, code that I am sending to the user when the node is saved for the first time. And when I save this node (for the first time), the node is modified to ensure that it is owned by user X and not by anonymous. Ok, is a little complicated, but these are the requests from my client.

So, I send to the user a mail with this line into: http://DOMINIO.EXT/node/123/edit/codeSHA1.

My problem is that Drupal obviously tells me that access is denied to perform the edit operation (node uid is X, but I'm uid 0) when I click onto that link (in my email client).

How can I resolve this "problem"? I don't want to install TAC or TACLITE, but I can write PHP code into one of my custom module.

  

回答列表

2
 
vote

以下是使用自定义编码的解决方案。

  1. 将所有哈希代码存储到DB的访问代码(我认为已经这样做),小心单词不做MD5(节点ID)或SHA1(节点ID),因为任何人都可以要解决它。

  2. 使匿名用户能够编辑他们在提交编辑节点所需的内容类型的内容类型。我知道这是什么意思,继续阅读。

  3. 创建自定义模块,您将使用节点API拦截节点编辑步骤。

如果drupal 6: http://api.drupal.org/api/drupal/developer%21hooks%21core.php/function/hook_nodeapi/6

  $form1  

如果drupal 7: http://api.drupal.org/api/drupal/modules%21node%21node.api.php/function/hook_node_prepare/7

  $form2  

,这就是全部。

 

Here is a solution using custom coding.

  1. Store all hash codes that are the access code to the DB (I think you do this already), a word of caution do not do md5(node id) or sha1(node id) as anyone will be able to figure it out.

  2. Enable anonymous users to edit the content type they are submitting where the code is needed to edit the node. I know what this mean, keep reading.

  3. Create a custom module where you are going to use the NODE API to intercept the node edit step.

If Drupal 6: http://api.drupal.org/api/drupal/developer%21hooks%21core.php/function/hook_nodeapi/6

function YOUR-MODULE-NAME_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {   switch ($op) {     case 'prepare':      // Add PHP Code here to validate the hash code     // You can use an if/else condition to print an access denied message     // if the code is not valid or expired      break;   } } 

If Drupal 7: http://api.drupal.org/api/drupal/modules%21node%21node.api.php/function/hook_node_prepare/7

function YOUR-MODULE-NAME_node_prepare($node) {     // Add PHP Code here to validate the hash code     // You can use an if/else condition to print an access denied message     // if the code is not valid or expired } 

And that is all.

 
 
 
 
0
 
vote

您只需要使用您在自定义模块中实现的那个更改节点/%节点/编辑的访问回调。

  function mymodule_menu_alter(&$items) {   if (isset($items['node/%node/edit'])) {     $args = !empty($items['node/%node/edit']['access arguments']) ? $items['node/%node/edit']['access arguments'] : array();      $old_callback = $items['node/%node/edit']['access callback'];     $items['node/%node/edit']['access callback'] = 'mymodule_node_access';     array_push($args, $old_callback);     array_push($args, 4);     $items['node/%node/edit']['access arguments'] = $args;   } }  function mymodyle_node_access() {   $args = func_get_args();   $sha1 = array_pop($args);   $old_callback = array_pop($args);    if (!empty($sha1)) {     // The SHA1 value was passed in the URL.   }   else {     // The user is accessing the edit form without SHA1; let the other callback decide      // who can access the node edit form.     return call_user_func_array($old_callback, $args);   } }   

代码被写入,因为它能够呼叫先前设置的访问回调,而无需对其进行任何假设,它是它的回调以及它需要多少个参数。
mymodule_node_access() 必须返回 TRUE 当用户可以访问节点编辑表单时;在您的情况下,访问回调需要验证SHA1值是否正确,并在这种情况下返回 TRUE

 

You just need to change the access callback for node/%node/edit with the one you implement in your custom module.

function mymodule_menu_alter(&$items) {   if (isset($items['node/%node/edit'])) {     $args = !empty($items['node/%node/edit']['access arguments']) ? $items['node/%node/edit']['access arguments'] : array();      $old_callback = $items['node/%node/edit']['access callback'];     $items['node/%node/edit']['access callback'] = 'mymodule_node_access';     array_push($args, $old_callback);     array_push($args, 4);     $items['node/%node/edit']['access arguments'] = $args;   } }  function mymodyle_node_access() {   $args = func_get_args();   $sha1 = array_pop($args);   $old_callback = array_pop($args);    if (!empty($sha1)) {     // The SHA1 value was passed in the URL.   }   else {     // The user is accessing the edit form without SHA1; let the other callback decide      // who can access the node edit form.     return call_user_func_array($old_callback, $args);   } } 

The code is written as it is to be able to call the previously set access callback without to make any assumption about which callback it is, and how many arguments it requires.
mymodule_node_access() must return TRUE when the user has access to the node edit form; in your case, the access callback needs to verify the SHA1 value is correct, and return TRUE just in that case.

 
 

相关问题

4  根据添加到URL的参数,更改节点的主题方式  ( Change the way a node is themed based on an argument added to a url ) 
我目前正在尝试消除我对我正在处理的网站的面板模块的需求,并且没有大量的PHP体验。我如何改变基于添加到URL的参数显示节点的方式? (例如 http://example.com/node/123/argument 。)我已经拥有了节点类型主题,但我需要基于参数以不同的形式显示节点。谢谢你的帮助,为你的帮助。 ...

5  使用Drupal API获取来自数组的节点值?  ( Get node values from array with drupal api ) 
使用drupal api,我发现您可以使用noad_load获取节点的值: $thisnode = node_load($nid = $child2, $vid = NULL, $reset = FALSE); 现在很容易以这种方式回应标题 $thisnode->title; 但是当我尝试从自定义...

7  jQuery Get或Post Method for Drupal Block模块  ( Jquery get or post methods for drupal block module ) 
可以使用jQuery Get或Post方法来获取Drupal7.x块模块中的数据动态。我是一个新手司法。 这是我的event_calendar.module文件 function event_calendar_help($path, $arg) { switch ($p...

2  无法保存术语“Branford的LePetitCafé的大荣誉”  ( Unable to save term big honor for branfords le petit caf%c3%a9 ) 
我正在尝试使用CaCaonomy_term_Save函数拯救名称"Branford的LePetitCafé的大荣誉" ,这将我抛出以下错误 PDOException: in drupal_write_record() in common.inc 是与字符编码有关的事情吗?我应该要转换角色吗?我不确定如何做...

1  使用ajax更新表单元素的默认值  ( Update default value of form element with ajax ) 
我在节点上有一个电子邮件字段添加表单,我想检查此电子邮件是否存在于同一节点表单中的城市字段,然后我的代码是: function custom_code_form_car_node_form_alter(&$form, &$form_state, $form_id){ $form["field_user_ema...

4  疏浚DL,在多路环境上具有依赖性  ( Drush dl with dependencies on a multisite environment ) 
在多站环境上使用 drush dl <project> 在网站特定文件夹中下载项目时,模块正在下载到/模块。但是,依赖项正在下载到/站点/全部/模块。有没有方法可以使用疏巫5迫使疏巫将依赖关系下载到站点特定的模块文件夹? ...

2  设置块和其他预先存在的内容类型的小组类别?  ( Setting panels category for blocks and other pre existing content types ) 
当一个面板向面板添加新内容时,它们会给出一个类别列表,每个类别都有各种内容类型。 设置上述内容类型如果您正在编写自己的插件... <button type="submit" class="btn btn-default">Valider</button> 0 但是设置其他模块创建的内容类型的类别如何? 我...

1  如何选择在其字段上应用过滤器的分类术语?  ( How can i select taxonomy terms applying filters on its fields ) 
我正在建立一个我决定大量使用Drupal项目(节点,分类,视图)的项目,但我发现难以以简单的方式检索数据。 我已经定义了一个分类词汇表,其中自定义字段是对其他词汇术语的引用。 例如,我有一个book_author词汇和书籍词汇,需要获得某个作者TID所写的所有书籍。 我是否可以使用单个呼叫或者我必须在CaCaono...

3  “内容访问”(模块)和权限“查看自己未发布的内容”问题  ( Problem with content access module and permission view own unpublished cont ) 
我自几天以来有问题,我没有找到我的答案。 当我安装内容访问,权限 View own unpublished content 没有再工作了。 一些关于我的配置的解释: 我使用 workbench 和 workbench审核创建一个简单的工作流程(我没有改变任何设置:如此草案,在审查中,发布) 我有2个角色,他们管理...

4  如何在块中展示问题?  ( How do i display questions in blocks ) 
如何使用测验模块在块中显示问题? 我使用视图模块进行,但是当我点击 start测验时,它会进入一个页面。我希望在块内完成所有功能。 ...

3  添加管理员?  ( Add an administrator ) 
我已经添加了一个新的drupal用户,所以我如何使它们成为网站的管理员? 我似乎无法找到一个设置吗?用户角色是经过身份验证和匿名的。 但默认登录用户名肯定有某种管理员权限。如何向新用户授予同样的特权? 在 config&gt;人们设置了管理员角色,它是一个选择菜单,但它只有禁用选项:s ...

0  在凭证模式下使用注册代码模块,试图修复  ( Issue with registration codes module in voucher mode trying to fix ) 
我正在使用注册代码模块并搜索解决方案以修复它。这里描述了: http://drupal.org/node/797602 这个问题有补丁,但代码的作者表示,它可能是"严重回归和堆积一堆其他模块,如simpleNews和简介,任何期望数据在$编辑中的任何东西。" 修补程序非常简单: - regcode_us...

1  如何添加多个时事通讯订阅的实例?  ( How can i add multiple instances of newsletter subscriptions ) 
我想以不同的方式展示时事通讯订阅不同的页面。因此,一旦我设置了新闻:订阅主页,它默认不适用于其他页面。 如何将其分配给不同位置的不同页面? ...

6  标志服务呼叫的正确格式是什么?  ( What is the proper format for the flag service calls ) 
我正在使用服务3 以及" 标志服务"已安装模块。我难以弄清楚如何以休息格式格式化呼叫。有人可以提供一个简短的例子吗? ...

4  Drupal 7日期字段中的时间字段而不是结束日期  ( A time field instead of end date in drupal 7 date field ) 
是否可以具有时间字段(例如,仅在分钟中)而不是Drupal 7中的日期字段的结束日期? 使用户选择开始日期和时间以及截止时间(以分钟为例),结束日期时间将开始日期时间+到期时间? ...

5  如何组合2个暴露过滤器(串和分类字段)  ( How to combine 2 exposed filters string and taxonomy field ) 
我需要为我的内容类型的搜索框创建一个视图;搜索字符串必须匹配标题或CCK分类字段。有没有观点模块,允许这样做?我尝试了 http://drupal.org/project/views_filters_populate ,但它只适用于2个字符串字段。 ...

1  没有SQL查询的结果  ( No result from an sql query ) 
我有一个与包含以下代码的自定义PHP字段的视图。 $storeArray = array(); $result = db_query("SELECT nid FROM node WHERE type ='emp'"); while ($row = mysql_fetch_array($result, ...

1  打印出实体参考的NID  ( Print out nid of entity reference ) 
我有一个自定义字段,即使用时的实体参考 打印渲染($内容['field_call_to_action_1']); 在内容类型模板中,它将标题呼叫呼叫打印到操作1 ,以及实体引用链接的内容的标题。 如何才能将其打印出nid? 谢谢你的时间! ...

18  在Drupal 7节点中呈现或打印图像.TPL?  ( Render or print image in a drupal 7 node tpl ) 
我正在尝试用tpl和当我试图打印图像时的节点,我无法找到像d6中的图像路径..我必须呼叫正确输出图像..我的意思是主题('') )? Array ( [und] => Array ( [0] => Array ( ...

2  如何在视图中显示应用过滤器?  ( How to show applied filters in a view ) 
我已经定义了一些上下文过滤器到视图,我需要显示一个像"应用过滤器:filter_name1:xyz,filter_name2:ykx" 的字符串。 这是在Views中进行最干净的方式3? ...




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


Licensed under cc by-sa 3.0 with attribution required.