Drupal:php脚本的访问权限?

时间:2010-07-14 18:40:22

标签: drupal drupal-6

我正在Drupal网站上编写一个自定义的PHP代码。我需要从PHP加载特定页面的内容。

这些页面仅对经过身份验证的用户可见,并且我似乎无法从php访问它们,即使我以用户身份登录时触发了脚本。

有没有办法从php模拟“登录”用户,所以我可以访问该网站的所有内容?

更新

global $user;
if (user_access('access content')) {

require_once("dompdf/dompdf_config.inc.php");

$html = file_get_contents('http://mywebsite.com/admin/store/orders/45/invoice/print');


$dompdf = new DOMPDF();
$dompdf->load_html($html);

//$dompdf->load_html_file('invoices/' . $file);
$dompdf->render();
$dompdf->stream("sample.pdf");
}

我尝试过相对路径并且它是一样的......

这是模仿管理员用户

//access as administrator
global $user;
$original_user = $user;
session_save_session(FALSE); 
$user = user_load(array('uid' => 1));

//generate pdf
require_once("dompdf/dompdf_config.inc.php");
$html = file_get_contents('http://mywebsite/admin/store/orders/45/invoice/print');
$dompdf = new DOMPDF();
$dompdf->load_html($html);
//$dompdf->load_html_file('invoices/' . $file);
$dompdf->render();
$dompdf->stream("sample.pdf");

//logout as administrator
$user = $original_user;
session_save_session(TRUE); 

我仍然将访问权限拒绝为生成的页面(并生成了pdf)。 感谢

3 个答案:

答案 0 :(得分:2)

这样做的代码是:

<?php
if (user_access('access content')) {
  print "You have the permission 'access content'";
}
?>

运行绕过权限系统的代码看似简单易行,但实际上是一个严重的安全漏洞。

但是,因为这就是你所要求的:

<?php
global $user;
if ($user->uid) {
  print "You are a registered user"
}
?>

但同样,永远不要将此作为权限的替代品。

答案 1 :(得分:1)

  

这些页面仅对经过身份验证的用户可见,并且我似乎无法从php访问它们,即使我以用户身份登录时触发了脚本。

Drupal检查用户是否有权使用全局变量$user查看节点。要执行您要执行的操作,如果您不能相信当前登录的用户有权查看您感兴趣的节点,则应阅读Safely Impersonating Another User

我不是说你应该这样做。在冒充其他用户之前,我会验证所遵循的方法是否是唯一可能的方法。 例如,如果您只需要访问节点中包含的字段,则可以使用node_load(),它不会验证当前用户是否可以查看加载的节点。 如果需要显示节点的主体,可以使用以下代码:

$node = node_load($nid);
if ($node) {
  $body = check_markup($node->body, $node->format, FALSE);
}

但是,显示当前用户无权访问的信息会被视为安全问题。

更新

您的代码存在的问题是您使用的是file_get_contents('http://mywebsite/admin/store/orders/45/invoice/print');这样做,您将打开与该站点的新连接,并以匿名用户身份打开新连接。这就是验证用户能够看到的节点未返回的原因 即使代码可以工作,你得到的不是仅渲染节点的HTML,而是整页,包括Drupal通常显示在顶部和左/右侧的块。

如果您对渲染节点感兴趣,那么您应该使用以下代码。 (这只是一个骨架,而且还不完整。)

// $nid is the node ID.
// Check the result, in the case the node has been deleted, or there are other errors.
$node = node_load($nid);
if ($node) {
  // The arguments tell the function that you don't want to render a teaser, that the node is
  // rendered as it is the only node in the page, and that you don't want the additional
  // links that are usually rendered after the node content.
  $html = node_view($node, FALSE, TRUE, FALSE);

  // This is your code.
  $dompdf = new DOMPDF();
  $dompdf->load_html($html);
  $dompdf->render();
  $dompdf->stream("sample.pdf");
}

答案 2 :(得分:0)

关于更新的代码。 您的file_get_contents将以“匿名用户”的形式提取内容。这只是你的代码不好的一个原因:

每当您的代码运行时,它将打开您自己的站点并解析该代码:导致至少两个“Drupals”被加载:实际上至少有两个综合浏览量向用户显示一个页面。但是这种方法可能存在更多问题。

相反,您应该找到在http://mywebsite.com/admin/store/orders/45/invoice/print创建页面的代码/函数,并将其用作PDF创建者的输入。