某些经过身份验证的用户无法访问安全内容或使用受限制的API

时间:2018-01-26 00:22:36

标签: drupal drupal-7

我迫切需要帮助。

我是网站(rockalingua.com)的开发者,该网站提供学习管理系统的订阅。我们开发了LMS,创建了几个drupal模块。

到目前为止它工作得很好但我们收到一些学校的报告,一些学生(经过身份验证的用户)无法访问某些内容(他们收到的消息表明他们没有权限查看该内容)

这似乎是随机的,但是当发生这种情况时,网站的行为就好像他们没有登录一样。如果再次登录,他们通常可以访问内容(他们报告他们有时必须重新启动浏览器才能实现)

出现此问题的网页使用我们创建的REST API来跟踪学生的进度。

搜索日志我意识到在课程开始使用系统后的一段时间,很多警告和通知消息被转储到消息日志中,报告未经验证的用户尝试使用来自相同IP的URL以及之前几秒或几分钟的URL,经过身份验证的用户,可以毫无问题地访问它。

我已经多次检查了所有涉及的代码,并且发现它没有任何问题,特别是当它似乎随机发生时。

我知道大多数学校都有使用缓存的代理。但是对代理不太了解,或者它们是否会影响这个问题。

如果是这样,可以做些什么来避免学校代理缓存动态页面?

更新: 我包括我们在典型的受影响请求上发送的典型响应标头,以及一些相关代码:

Accept-Ranges: bytes
Age: 0
Cache-Control: no-cache, must-revalidate
Content-Encoding: gzip
Content-Language: en
Content-Length: 4590
Content-Type: text/html; charset=utf-8
Date: Fri, 26 Jan 2018 08:53:52 GMT
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Server: Apache
Vary: Accept-Encoding
Via: 1.1 varnish
X-Content-Type-Options: nosniff
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Powered-By: PHP/5.4.45
X-UA-Compatible: IE=Edge,chrome=1
X-Varnish: 1592956310

在这里,你有一个典型的AJAX请求的代码,我似乎有时会表现得像:

  // ...
  if($form_state['data']['is_student']) {
    $form['submit'] = [
      '#type' => 'submit',
      '#value' => t('Go back'),
      '#attributes' => [
        'class' => [$form_state['data']['activity_type']],
      ],
      '#ajax' => [
        'callback' => 'activity_modal_form_submit_callback'
      ],
    ];
  } else {

  }
  return $form;
}

/* Ajax callback to update the activity item after closing its modal */
function activity_modal_form_submit_callback($form, &$form_state) {

  ctools_include('modal');
  ctools_include('ajax');
  global $user;

  $activities_retriever = new student_task_activities($user->uid, $form_state['data']['task_id']);
  $activity = $activities_retriever->lms_student_task_activity($form_state['data']['activity_id']);
  $activity_data = array(
    //'activity_name' => $activity['title'],
    'times' => $activities_retriever->lms_student_task_activity_repetitions_assigned($activity['activity_id']),
    'task_activity_entity_id' => $activity['activity_entity'],
    'type' => $activity['activity_type'],
    'title' => $activity['activity_title'],
    'status' => $activity['status'],
    'progress' => $activity['progress'],
    'is_correctness_supported' => $activity['is_game_supported'],
    'percent_right' => $activity['percent_right'],
    'is_student' => $form_state['data']['is_student'],
  );

  $item_updated = render_activity_item(
    $form_state['data']['activity_id'],
    $activity_data,
    $form_state['data']['task_id'],
    $form_state['data']['is_student'],
    $form_state['data']['due_date'], false);

  $commands[] = ctools_modal_command_dismiss();
  if($activity_data['type'] == 'video' || $activity['activity_type'] == 'song') {
    $commands[] = ajax_command_replace('#activity_' . $form_state['data']['activity_id'], $item_updated);
  }

  print ajax_render($commands);
  drupal_exit();
}

因为它调用student_task_activities需要构造函数上的uid来检索活动数据,并且在描述的情况下它接收0,activity数组为空并且在尝试呈现活动项时通知被转储到日志警告中有关丢失的信息。有人说uid是0,这就是我意识到用户ID在这个过程的某个地方丢失了。

0 个答案:

没有答案