PhpMyAdmin SSO退出

时间:2017-01-09 12:42:34

标签: php phpmyadmin single-sign-on

我正在使用PhpMyAdmin和自定义单点登录(SSO)脚本直接登录界面。由我自己的系统给出一个唯一的登录令牌,PHP调用SSO脚本。此脚本在我的系统中查找唯一ID,以便检索MySQL用户名和密码,并将其返回给PhpMyAdmin。

到目前为止这是有效的,但我的下一个目标是在一定程度的不活动后自动注销。如果没有SSO,删除我的浏览器cookie并单击任何链接,我会进入登录页面,并显示消息»您的会话已过期。请再次登录。«。但是,我无法从我的SSO脚本中重现此行为。

这是我的SSO脚本:

<?php

/**
 * Session timeout in seconds.
 */
define('SESSION_TIMEOUT', 60);

/**
 * @return array|null Returns an array with login credentials or null for no login.
 */
function get_login_credentials() {
    parse_str($_SERVER['QUERY_STRING'], $query);

    /* check for session activity (timeout) */
    if (isset($_SESSION['ssoLastActivity']) && (time() - $_SESSION['ssoLastActivity']) > SESSION_TIMEOUT) {
        $sessionExpired = true;
    } else {
        $sessionExpired = false;
    }

    if (isset($query['old_usr'])) {
        /* logout and back to index page */
        unset($_SESSION['ssoLastActivity']);
        unset($_SESSION['ssoUser']);
        unset($_SESSION['ssoPassword']);
        header('Location: index.php');
        exit;
    }

    if ($sessionExpired) {
        unset($_SESSION['ssoLastActivity']);
        unset($_SESSION['ssoUser']);
        unset($_SESSION['ssoPassword']);

        /******** POINT OF QUESTION ********/
        /* I'm trying to give the same response as if the cookies were deleted.
           I land on the login page as desired, however I'm missing the session
           timeout message. */
        header('Content-Type: application/json');
        echo json_encode(['redirect_flag' => '1', 'success' => false, 'error' => '']);
        exit;
        /***********************************/
    }

    /* update session activity timestamp */
    $_SESSION['ssoLastActivity'] = time();

    if (!empty($_SESSION['ssoUser']) && !empty($_SESSION['ssoPassword'])) {
        /* already logged in */
        return [
            $_SESSION['ssoUser'],
            $_SESSION['ssoPassword'],
        ];
    }

    /* retrieve MySQL login credentials here and store them in $user and $password */

    /* $user = ...; $password = ...; */

    return [
        $user,
        $password,
    ];
}

有没有人通过我的SSO脚本注销解决方案,这会导致我进入带有消息的登录页面,会话已过期?

更新:

问题似乎与我的PhpMyAdmin服务器配置有关(在我的案例中为/etc/phpMyAdmin/servers.ini.php):

<?php
$cfg['Servers'] = array(
    1 => array('auth_type' => 'signon', ..., 'SignonScript' => '/usr/share/phpMyAdmin/sso.php', 'SignonURL' => 'index.php?server=1'),
    2 => array('auth_type' => 'cookie', ...)
);

我在会话超时后检查了网络请求,事实证明,实际上有一个请求?session_expired=1(触发会话超时消息)发送到服务器1;因为此脚本返回null(无登录),它会重定向到SignonURL index.php?server = 1 ,省略额外的 session_expired 查询参数。

我可以通过&amp; session_expired = 1 扩展此网址,但这也会在定期注销时触发此消息。

我愿意接受改善行为的任何想法。

0 个答案:

没有答案