Drupal 7 开发内部培训资料, 分头诗人

如何废除drupal的session机制,使用原生方法?

赞成!
0
否决!

drupal的session机制导致我用第三方授权的时候因为jsessionid不同而会话失效,请问: 怎么废除drupal自带的session机制,改用原生的session方法?

 

将bootstrap.inc文件 2251行左右的代码注释掉可以达到目的,但是drupal离开了session就跑不起来了。

case DRUPAL_BOOTSTRAP_SESSION:
          require_once DRUPAL_ROOT . '/' . variable_get('session_inc', 'includes/session.inc');
          drupal_session_initialize();
          break;

 

http://drupalchina.cn/doc/1074.html 这个文章貌似在说这个问题。 但是太笼统了,

请各路高手给看看,要烟钱也可以。

2 个回答

赞成!
0
否决!

最好别废除,这样做很危险的,建议采取其他方法

赞成!
0
否决!

上面说的session好像是在过滤那里用的,你可以追踪下源码,、话说给你的那个说的是过滤好像。其实你可以换个方式思考,你的第三方授权是drupal给其他网站授权即使用drupal的用户,登陆其他网站。还是使用其他网站用户登陆drupal的。如果是前者,你只需要给提供一个api接口,这个接口需要密钥动态加密等一系类你能想到验证方式进行验证。获取drupal的除了密码意外的其他信息的方式进行登陆,其他网站直接用拿到的信息登陆,参考OAuth2登陆。如果是后者,同理拿到第三网站的详细信息,直接是用drupal的登陆函数登陆,drupal有一个登陆函数,具体忘记了,可以追踪下,我简单查了,希望下面代码对你有帮助

//用户输入账号密码后处理函数
function user_login_submit($form, &$form_state) {
  global $user;
  //根据uid,加载整个user
  $user = user_load($form_state['uid']);
  $form_state['redirect'] = 'user/' . $user->uid;
  //登陆结束函数
  user_login_finalize($form_state);
}

function user_login_finalize(&$edit = array()) {
  global $user;
  //插入wathdog,监控登陆,如果是wachdog写入数据库则填写到watchdog表,否则写入apache系统日志
  watchdog('user', 'Session opened for %name.', array('%name' => $user->name));
  // Update the user table timestamp noting user has logged in.
  // This is also used to invalidate one-time login links.
//修改用户最后一次登陆时间
  $user->login = REQUEST_TIME;
  db_update('users')
    ->fields(array('login' => $user->login))
    ->condition('uid', $user->uid)
    ->execute();

  // Regenerate the session ID to prevent against session fixation attacks.
  // This is called before hook_user in case one of those functions fails
  // or incorrectly does a redirect which would leave the old session in place.
  //重新生成session id,防止session攻击
  drupal_session_regenerate();
  //执行其他模块的user_hook
  user_module_invoke('login', $edit, $user);
}