如何解决使用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 举报,一经查实,本站将立刻删除。