Ich habe einen osCommerce-Shop und möchte auf Shopware 4 migrieren. Im alten osCommerce-Shop wurden die Kundenpasswörter mit SHA und SALT verschlüsselt, in Shopware 4 gibt es MD5-Verschlüsselung. Daher würde ich gerne ein Plugin schreiben welches bei einem erfolglosen Shopware-Login dann das alte osCommerce-Login benutzt und bei Erfolg das eingegebene Passwort in die Shopware4-User-Tabelle mit MD5 ablegt. In meinem Plugin habe ich mich bis zum Event “Enlight_Controller_Action_PreDispatch_Frontend_Account” durchgearbeitet, danach muss ich passen, hat jemand einen Tipp wie ich da weiter kommen könnte ?
Hi seibit, in Shopware 4.1 haben wir einen neuen PasswortEncoder. Der unterstützt von Haus aus verschiedene Passwort-Typen. Es werden die Standard-Passwort-Hashes von Oxid, Magento, XTC und Presta da bei der Migration direkt so importiert, dass diese in Shopware einfach weiter genutzt werden können. Jetzt bin ich bisher eigentlich davon ausgegangen, dass osCommerce wie XTC einfach nur MD5 macht - das unterstützen wir halt direkt. Für SHA + Salt haben wir zwar einen Adapter - der ist aber noch etwas mächtiger, weil da die Iterationen und die Salt-Länge im Hash mit kodiert werden. Das ist für deinen Fall vermutlich schon etwas zu komplex. Zum “selber machen” schaust du dir am besten einfach mal einen von unseren Standard-Encodern an. Md5+Salt wird bspw. hier gemacht: /engine/Shopware/Components/Password/Encoder/LegacyBackendMd5.php Das sollte sich ja relativ gut auf Sha+Salt übertragen lassen. Unser PasswortEncoder-Interface ist hier beschrieben: http://wiki.shopware.de/_detail_1297_44 … ssw.F6rter Um jetzt einen neuen Encoder in SW zu registrieren, registrierst du dich einfach auf das Event Shopware_Components_Password_Manager_AddEncoder und fügst da deinen Encoder hinzu. Das kannst du dir hier ganz gut abschauen: /engine/Shopware/Plugins/Default/Core/PasswordEncoder/Bootstrap.php: /\*\* \* This method registers shopware's default hash algorithm \* @param Enlight\_Event\_EventArgs $args \* @return array \*/ public function onAddEncoder(\Enlight\_Event\_EventArgs $args) { $hashes = $args-\>getReturn(); $hashes[] = new Shopware\Components\Password\Encoder\Bcrypt($this-\>getBcryptOptions()); $hashes[] = new Shopware\Components\Password\Encoder\Sha256($this-\>getSha256Options()); $hashes[] = new Shopware\Components\Password\Encoder\LegacyBackendMd5(); $hashes[] = new Shopware\Components\Password\Encoder\Md5(); $hashes[] = new Shopware\Components\Password\Encoder\PreHashed(); return $hashes; }
In deinem Fall würdest du halt nur deinen neuen Encoder hinzufügen Ich würde mir also an deiner Stelle nicht die Arbeit machen, das für die 4.0.8 händisch zu portieren, da das ab der 4.1.0 halt deutlich einfacher wird. Zieh dir einfach den RC2 und schau dir das da mal an. Schöne Grüße, Daniel
Hallo Daniel, vielen Dank für die schnelle & kompetente Antwort, wir werden auf die Version 4.1 updaten und dann testen. Grüße aus Bonn Achim SEIBIT
Wir versuchen zur Zeit einen eigenen Encoder zu erstellen. Doch leider ist er im Backend nicht sichtbar. Folgendes haben wir gemach: 1. Ein neues Plugin namens HxAuth im Ordner Plugins/Local/Core/HxAuth angelegt. 2. Eine Bootstrap-Datei mit folgendem Inhalt erstellt: class Shopware\_Plugins\_Core\_HxAuth\_Bootstrap extends Shopware\_Components\_Plugin\_Bootstrap { public function onAddEncoder(\Enlight\_Event\_EventArgs $args) { $hashes = $args-\>getReturn(); $hashes[] = new Shopware\Components\Password\Encoder\HxSsha(); return $hashes; } }
3. Den Encoder im Ordner HxAuth/Components/Password/Encoder mit dem Dateinamen HxSsha.php erstellt und ihn erst einmal das Gleiche machen lassen, wie den MD5 Encoder: namespace Shopware\Components\Password\Encoder; class HxSsha implements PasswordEncoderInterface { /\*\* \* @return string \*/ public function getName() { return 'HxSsha'; } /\*\* \* @param string $password \* @param string $hash \* @return bool \*/ public function isPasswordValid($password, $hash) { if (strpos($hash, ':') === false) { return $hash == md5($password); } list($md5, $salt) = explode(':', $hash); return $md5 == md5($password . $salt); } /\*\* \* @param string $password \* @return string \*/ public function encodePassword($password) { return md5($password); } /\*\* \* @param string $hash \* @return bool \*/ public function isReencodeNeeded($hash) { return false; } }
4. Das Plugin im Backend aktiviert und den Cache geleert. Leider taucht aber der Encoder nicht im Backend auf. Hat hiermit schon jemand nähere Erfahrungen gemacht? Es wäre echt cool, wenn wir das ans Laufen bekommen würden, damit unsere jetzigen Kunden nicht alle neue Passwörter brauchen. Viele Grüße Frederic
Hallo, die Liste mit den angezeigten Passwörtern wird im Backend/Base-Controller zusammengebaut: public function getAvailableHashesAction() { $hashes = Shopware()-\>PasswordEncoder()-\>getCompatibleEncoders(); $result = array(); $result[] = array('id' =\> 'Auto'); $blacklist = array('prehashed', 'legacybackendmd5'); foreach ($hashes as $hash) { if (in\_array(strtolower($hash-\>getName()), $blacklist)) { continue; } $result[] = array( 'id' =\> $hash-\>getName() ); } $totalResult = count($hashes); $this-\>View()-\>assign(array( 'success' =\> true, 'data' =\> $result, 'total' =\> $totalResult, )); }
Da müsstest du schauen, dass dein Encoder selektiert wird. Wenn du die Methode isCompatible implementierst, solltest du bspw. auch sicher stellen, dass Sie bei dir „true“ zurück gibt. lG Daniel