Ich habe eine Seite mit selbstgestricktem Login auf Basis von PHP-Sessions. Jetzt will ich phpMyAdmin einbinden, ohne dass man sich nochmal darin einloggen muss - schließlich sind die Leute ja schon auf meiner Seite eingeloggt.
Sowas schreit förmlich nach Single Sign-On. Schönes Buzzword, allerdings findet Google für phpMyAdmin recht wenig zu diesem Thema.
Nach einigem Trial&Error sowie einem Nachmittag in #phpmyadmin habe ich eine Lösung geschrieben, die nur eine Ergänzung der config.inc.php braucht, ansonsten nicht in phpMyAdmin eingreift und nichtmal das normale Login stört - ich kann also dieselbe phpMyAdmin-Instanz für Single Sign-On und Cookie-basiertes Login verwenden.
Das folgende steht bekanntlich in phpMyAdmin/config.inc.php (oder sollte zumindest dort stehen - die anderen auth_type sind böse):
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = 'root'; # eigentlich überflüssig
$cfg['Servers'][$i]['password'] = '';
Das ist auch weiterhin mein Default - solange niemand aus einer passenden PHP-Session kommt, soll er sich ganz normal anmelden können.
Kommen wir zum Single Sign-On, einzufügen nach obigen Standardwerten:
if (isset($_COOKIE['PHPSESSID'])) {
$cb_pma_session = session_name(); # safe original session name
$cb_pma_session_id = session_id(); # ... and id
session_write_close();
session_name('PHPSESSID');
session_id($_COOKIE['PHPSESSID']);
session_start();
if (isset($_SESSION['PMA_single_signon_user'])) { # single sign-on
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = $_SESSION['PMA_single_signon_user'];
$cfg['Servers'][$i]['password'] = $_SESSION['PMA_single_signon_pass'];
$cb_pma_token = $_SESSION['PMA_token']; # get token
}
# back to the phpMyAdmin session
session_write_close();
session_name($cb_pma_session);
session_id($cb_pma_session_id);
session_start();
if ($cb_pma_token) {
# set token - required for direct access of phpMyAdmin subpages
$_SESSION['PMA_token'] = $cb_pma_token;
}
}
Dieser Code springt lustig zwischen der phpMyAdmin-Session und der Session meiner Seite hin und her und holt sich aus der dortigen Session $_SESSION['PMA_single_signon_user'] und $_SESSION['PMA_single_signon_pass'] ab - die Bedeutung dieser beiden Variablen sollte naheliegend sein ;-)
Was auffällt, ist das Zwischenspeichern von $_SESSION['PMA_token'] in einer Variable, die später in die phpMyAdmin-Session eingespeist wird. Sinn dieser Übung ist es, auch Unterseiten von phpMyAdmin ("zeige Tabelle 'foo' an") direkt verlinken zu können - die erfordern aus Sicherheitsgründen die Angabe des (zufällig generierten) Tokens als URL-Parameter.
Der Code auf meiner Hauptseite ist wiederum naheliegend, ich muss nämlich die Session passend anfüttern:
$_SESSION['PMA_single_signon_user'] = "username"; # MySQL Username
$_SESSION['PMA_single_signon_pass'] = "topsecret"; # MySQL Passwort
if (!isset($_SESSION['PMA_token'])) {
$_SESSION['PMA_token'] = md5(uniqid(rand(), true));
}
phpMyAdmin muss natürlich auf der gleichen Domain laufen, damit das Session-Cookie der Hauptseite verfügbar ist.
Beachten sollte man, dass der User in phpMyAdmin alles darf, was ihm seine MySQL-Rechte erlauben - bei Bedarf sind diese also entsprechend restriktiv zu setzen.
Ich habe das auch mal als
Enhancement Request an die phpMyAdmin-Entwickler geschickt. Es bleibt abzuwarten, ob es Einzug in die offizielle Codebasis findet - das Umschalten zwischen mehreren Sessions ist schon etwas exotisch ;-)
CBlog am : Single Sign-on in phpMyAdmin aus einer anderen PHP-Session II