我正在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)。 感谢
答案 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创建者的输入。