Drupal: права доступа для скриптов php? - PullRequest
0 голосов
/ 14 июля 2010

Я пишу собственный php-код на моем сайте Drupal. Мне нужно загрузить содержимое определенных страниц из 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 ]

2 голосов
/ 15 июля 2010

Код для этого:

<?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 голос
/ 15 июля 2010

Эти страницы видны только аутентифицированным пользователям, и кажется, что я не могу получить к ним доступ с php, даже если я запускаю скрипт, когда я вошел в систему как пользователь.

Drupalпроверяет, есть ли у пользователя разрешение на просмотр узла с помощью глобальной переменной $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");
}
0 голосов
/ 15 июля 2010

Об обновленном коде.Ваш file_get_contents будет извлекать контент как «анонимный пользователь».Это одна из причин, по которой ваш код является плохой идеей:

Каждый раз, когда ваш код запускается, он открывает ваш собственный сайт и анализирует этот код: в результате по крайней мере два "Drupals" должны быть загружены: по крайней мере, по крайней мередва просмотра, чтобы показать одну страницу пользователю.Но многие другие проблемы с этим подходом возможны.

Вместо этого вы должны найти код / ​​функцию, которая создает страницу в http://mywebsite.com/admin/store/orders/45/invoice/print, и использовать ее в качестве входных данных для создателя PDF.

...