Das Problem hatte ich auch. Hat mich ganz schön genervt bei >1500 importierten Mitgliedsdaten...
Das Problem liegt bei kb_md5fepw. Dies sorgt für eine MD5-Verschlüsselung von FE-User-Passwörtern im Backend und Frontend. Nach Umstellung auf UTF-8 und Installation von kb_md5fepw funktionierte das Login bei mir nicht mehr bei Benutzernamen, die Sonderzeichen (öäüß etc.) enthielten.
Hintergrund
Ursache ist vermutlich eine fehlerhafte MD5-Implementation:
Nach FE-User-Login überprüft kb_md5fepw die Eingabe gegen die gespeicherten Benutzerdaten (Ext. kb_md5fepw: class.tx_kbmd5fepw_sv1.php). Die entsprechende Zeile lautet
$OK = $this->compareUident($user, $this->login, 'superchallenged');
Die Überprüfung erfolgt also in der Methode compareUident($user, $loginData, $security_level='') in t3lib/class.t3lib_userauth.php ab der Zeile
switch ($security_level) {
case 'superchallenged':
Hier wird das im Login-Formular eingegebe Passwort (string)$loginData['uident']) gegen einen kombinierten MD5-Hash verglichen ((string)md5($user[$this->username_column].':'.$user[$this->userident_column].':'.$loginData['chalvalue']))
Das eingegebene Passwort selbst wird vorher von kb_md5fepw MD5-verschlüsselt und hier liegt wahrscheinlich das Problem: Die Verschlüsselung erfolgt per JavaScript in class.tx_kbmd5fepw_newloginbox.php ab der Zeile
function superchallenge_pass(form) {
var pass = form.pass.value;
Diese Verschlüsselung ist wahrscheinlich nicht UTF-8 konform, kann zumindest jedoch nicht mit Sonderzeichen korrekt umgehen. Der MD5 Hash wird aus dem Benutzernamen, dem Passwort und einem Challange-Wert gebildet. Die Verwendung des Benutzernamens in der Verschlüsselung erklärt dann auch die Fehlfunktion.
Lösung
Das Problem habe ich mit einem quick-and-dirty Workaround beseitigt:
In class.tx_kbmd5fepw_sv1.php wird der Aufruf von compareUident ersetzt durch:
// Checking password match for user:
//$OK = $this->compareUident($user, $this->login, 'superchallenged');
$OK = FALSE;
if( md5($_POST['pass']) === $user['password']){
$OK = TRUE;
}
Das per POST ausgelesene Passwort wird also per MD5 verschlüsselt und mit dem Datenbank-Wert ($user['password']) verglichen. Hier könnte man statt $_POST['pass'] auch die entsprechende TYPO3-Variable nehmen (habe gerade vergessen, wie die heisst).
In class.tx_kbmd5fepw_newloginbox.php wird das JavaScript gelöscht per $js='':
function loginFormOnSubmit(&$params, &$ref) {
$js = '
function superchallenge_pass(form) {
var pass = form.pass.value;
if (pass) {
var enc_pass = MD5(pass);
var str = form.user.value+":"+enc_pass+":"+form.challenge.value;
form.pass.value = MD5(str);
return true;
} else {
return false;
}
}
';
// reset sucking $js:
$js = '';
Fazit: Zwei kleine Änderungen im kb_md5fepw-Code. Danach läuft das Login ohne Probleme und benötigt zudem kein Javascript mehr.
Gruß,
Kai