微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用SimpleSAMLphp后如何从Drupal中提取旧会话处理?

如何解决使用SimpleSAMLphp后如何从Drupal中提取旧会话处理?

代码示例:

<?PHP

require_once(DRUPAL_ROOT . '/simplesaml/lib/_autoload.PHP');
session_write_close();
session_set_save_handler(new SessionHandler(),true);
$as = new \SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attributes = $as->getAttributes();

$samlSession = \SimpleSAML\Session::getSessionFromrequest();
$samlSession->cleanup();


$_SESSION['saml'] = $attributes; // <-- this does not work,since altering $_SESSION at this point is useless. reading out $_SESSION on a another page does not have anything saved after calling the SimpleSAMLPHP functions

我们在我们的网站上将SimpleSAMLPHP作为SP与Shibboleth IDP一起使用。服务器无法运行Apache模块或内存缓存,因此我们需要使用PHP会话。在simplesamlphp documentation显示

如果我们在SimpleSAMLPHP和应用程序中使用PHP会话 我们正在保护,SimpleSAMLPHP将在以下情况下关闭任何现有会话 首次调用,以自己的会话为准 之后。如果您要在致电后恢复自己的会话 SimpleSAMLPHP,您可以通过清理会话来做到这一点:

$session = \SimpleSAML\Session::getSessionFromrequest();
$session->cleanup();

如果您不清理SimpleSAMLPHP的会话并尝试使用$ _SESSION 之后,您将不再使用自己的会话,并且所有数据 可能会迷路或无法进入。

问题是,这正是我们面临的问题。加载ssp文件后,我写到$_SESSION的所有内容都会在新的页面请求中丢失。

现在,我们正在使用Drupal7。我不知道如何在Drupal环境中实现文档代码

// use custom save handler
session_set_save_handler($handler); // what is this? what is $handler?
session_start();

// close session and restore default handler
session_write_close();
session_set_save_handler(new SessionHandler(),true);

// use SimpleSAML\Session
$session = \SimpleSAML\Session::getSessionFromrequest();
$session->cleanup();
session_write_close();

// back to custom save handler
session_set_save_handler($handler); // how do i get the Drupal handler?
session_start();

那么,如何在Drupal 7环境中实现会话交换?还是一般来说,如何获得会话处理程序/引用?

Drupal本身在session.inc中的some point进行了此操作:

session_set_save_handler('_drupal_session_open','_drupal_session_close','_drupal_session_read','_drupal_session_write','_drupal_session_destroy','_drupal_session_garbage_collection');

但是调用任何Drupal会话函数均无效,$_SESSION在使用SimpleSAMLPHP后始终不可写(或者实际上并没有保存)。

解决方法

编辑:

如果您不使用SimpleSAMLphp的独立Web UI,则可能会起作用:

require_once(DRUPAL_ROOT . '/simplesaml/lib/_autoload.php');

$as = new \SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attributes = $as->getAttributes();

$samlSession = \SimpleSAML\Session::getSessionFromRequest();
$samlSession->cleanup();
    
$_SESSION['saml'] = $attributes; 

它应保留原始会话处理程序(SSP也将使用该处理程序),然后通过恢复先前的会话ID和名称来重新加载旧的会话ID。


原始答案:

查看SimpleSAMLphp session handler's code,它应该已经恢复了上一个会话-如果在调用SimpleSAMLphp时有任何活动。

我想说的是,在SimpleSAMLPhp启动会话之前,您通过使用session_write_close();手动关闭了会话,因此当您关闭SimpleSAMLphp的会话时,无法还原前一个会话。

我将尝试执行以下操作(我假设这是您正在使用的代码):

// If I recall well,Drupal already starts session for you,// but if it's not the case in your configuration,go ahead and uncomment following lines
// session_set_save_handler($handler);
// session_start();

// use SimpleSAML\Session
$session = \SimpleSAML\Session::getSessionFromRequest();
$session->cleanup();

// Just resume your $_SESSION use
$_SESSION['myAttribute'] = 'myValue';    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。