Autologin funktioniert nicht, sobald Gast-Session am EQDKP-Portal

Message

Schönen guten Tag, mir ist bei dem Vorgehen des Autologins bei der Bridge noch eine Stelle aufgefallen, die ich für zumindest "unglücklich" halte: In der Klasse core/auth.class.php wird in der start()-Methode das Session-Handling und auch das Autologin über eine Bridge aufgebaut. Das Autologin wird hier aber erst sehr spät ausgeführt, was zu folgendem Problem führt: Als Erstes wird nämlich zunächst geprüft, ob eine Session bereits in der Datenbank vorhanden ist. Hierzu zählen auch Gast-Sessions. Wenn ich also zunächst auf die EQDKP-Seite gehe, danach mich an dem per Bridge angeschlossenem System (z.B. phpbb3.1) anmelde und dann die Seite des EQDKPs aktualisiere / neu aufrufe, so wird das Autologin nicht ausgeführt, da bereits eine Gast-Session im EQDKP existiert und diese dann weiterhin genutzt wird. Man ist also weiterhin nicht angemeldet, obwohl man am gebridgten System eine gültige Anmeldung hat. Dies kann nur umgangen werden, in dem man in der Datenbank den Session-Eintrag löscht (da Abmelden ja auch die Session im EQDKP nur auf eine Gast-Session setzt und diese nicht löscht). Dies kann und darf natürlich kein User selbst machen. Eine Traumlösung gibt es hier wahrscheinlich nicht, schließlich soll ja auch nicht bei jedem Seitenaufruf immer der Autologin ausgeführt werden (Thema Performance). Ein Vorschlag wäre, bei der Session-Überprüfung im ersten Schritt nur nach Sessions zu suchen, die mit einem angemeldeten User verbunden sind. Gibt es eine, so wird diese verwendet. Gibt es keine, wird das Autologin versucht. Klappt auch dies nicht, wird eine vorhandene Gast-Session genutzt / bzw. neue erstellt. Hier der betroffene Code: [code=76,'core/auth.class.php'] //Cookie-Data $arrCookieData = array(); $arrCookieData['sid'] = $this->in->getEQdkpCookie('sid'); $arrCookieData['data'] = $this->in->getEQdkpCookie('data'); $arrCookieData['data'] = ( !empty($arrCookieData['data']) ) ? unserialize(base64_decode(stripslashes($arrCookieData['data']))) : ''; //Let's get a Session if ($this->in->exists('s') && $this->in->get('s', '') != ""){ //s-param $this->sid = $this->in->get('s', ''); } else { $this->sid = $arrCookieData['sid']; } //Do we have an session? If yes, try to look if it's a valid session and get all information about it if ($this->sid != ''){ $arrResult = false; $objQuery = $this->db->prepare("SELECT * FROM __sessions s LEFT JOIN __users u ON u.user_id = s.session_user_id WHERE s.session_id = ? AND session_type = ?")->execute($this->sid, ((defined('SESSION_TYPE')) ? SESSION_TYPE : '')); if ($objQuery && $objQuery->numRows){ $arrResult = $objQuery->fetchAssoc(); } $this->data = $arrResult; if (!isset($this->data['user_id'])){ $this->data['user_id'] = ANONYMOUS; } //If the Session is in our Table && is the session_length ok && the IP&Browser fits //prevent too short session_length if ($arrResult){ //If the IP&Browser fits if (($arrResult['session_ip'] === $this->env->ip) && ($arrResult['session_browser'] === $this->env->useragent)){ //Check Session length if ((($arrResult['session_start'] + $this->session_length) > $this->current_time)){ //We have a valid session $this->data['user_id'] = ($this->data['user_id'] == (int)$arrResult['session_user_id']) ? intval($arrResult['session_user_id']) : $this->data['user_id']; $this->id = $this->data['user_id']; // Only update session DB a minute or so after last update or if page changes if ( !register('environment')->is_ajax && (($this->current_time - $arrResult['session_current'] > 60) || ($arrResult['session_page'] != $this->env->current_page) )){ $this->db->prepare("UPDATE __sessions :p WHERE session_id = ?")->set(array( 'session_current' => $this->current_time, 'session_page' => strlen($this->env->current_page) ? substr(utf8_strtolower($this->env->current_page), 0, 254) : '', ))->execute($this->sid); } //The Session is valid, copy the user-data to the data-array and finish the init. You you can work with this data. registry::add_const('SID', "?s=".((!empty($arrCookieData['sid'])) ? '' : $this->sid)); return true; } else { $arrSessionKeys = explode(";", $arrResult['session_key']); $arrSessionKeys = array_reverse($arrSessionKeys); $this->data['old_sessionkey'] = $arrSessionKeys[0]; } } } } else { $this->blnFirstVisit = true; } $this->data['user_id'] = ANONYMOUS; //START Autologin $boolSetAutoLogin = false; //Loginmethod Autologin $arrAuthObjects = $this->get_login_objects(); foreach($arrAuthObjects as $strMethods => $objMethod){ if (method_exists($objMethod, 'autologin')){ $arrAutologin = $objMethod->autologin($arrCookieData); if ($arrAutologin){ $this->data = array_merge($this->data, $arrAutologin); $boolSetAutoLogin = true; break; } } } //EQdkp Autologin if (!$boolSetAutoLogin){ $arrAutologin = $this->autologin($arrCookieData); if ($arrAutologin){ $this->data = array_merge($this->data, $arrAutologin); $boolSetAutoLogin = true; } } //Bridge Autologin if (!$boolSetAutoLogin && $this->config->get('cmsbridge_active') == 1 && $this->config->get('pk_maintenance_mode') != 1){ $arrAutologin = $this->bridge->autologin($arrCookieData); if ($arrAutologin){ $this->data = array_merge($this->data, $arrAutologin); $boolSetAutoLogin = true; } } //END Autologin //Let's create a session $this->create($this->data['user_id'], (isset($this->data['user_login_key']) ? $this->data['user_login_key'] : ''), $boolSetAutoLogin, ((isset($this->data['old_sessionkey'])) ? $this->data['old_sessionkey'] : false) ); $this->id = $this->data['user_id']; return true;[/code]

Comments 1