[3.0][UMGT] Doppelte Anmeldungen verhindern

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
Antworten
Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

[3.0][UMGT] Doppelte Anmeldungen verhindern

Beitrag von dave » 19.03.2015, 13:38:02

Eine Sache, die ich mich schon immer beim UMGT gefragt habe, ist, wie doppelte Anmeldungen verhindert werden. Ein kurzer Selbstversuch zeigt: Gar nicht.
Ich habe mich in meiner Testumgebung mit identischen Daten nochmals registriert und der Account wurde angelegt :?

Doof auch: Mit gleicher E-Mail-Adresse registriert und anderes Passwort gewählt, kommt der "neue" Nutzer nicht rein, da das Passwort nicht stimmt. Es sollte also bei der Registrierung definitiv eine Überprüfung statt finden, ob die Mail-Adresse (oder den Nutzername/je nach Anwendung und Konfiguration) bereits existiert und eine Meldung geworfen werden.

Die Umsetzung ist nicht schwer und lässt sich mit wenigen Zeilen direkt im RegistrationController erledigen. Ein zusätzliches Template im Template kann dann sogar die zusätzliche Meldung "Dieser Nutzername existiert bereits" ausgegeben werden.

Frage nun: Absichtlich gewollt oder Bug? - je nachdem erstelle ich dann einen Eintrag im Tracker ;)

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: [3.0][UMGT] Doppelte Anmeldungen verhindern

Beitrag von dr.e. » 20.03.2015, 00:02:40

Hallo dave,

die Antwort ist ganz einfach: das war bisher keine Anforderung! :) Insofern: stelle gerne einen Feature-Request ein.
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0][UMGT] Doppelte Anmeldungen verhindern

Beitrag von dave » 20.03.2015, 11:11:48

Supi,
Eintrag im Tracker ist drin: http://tracker.adventure-php-framework. ... php?id=248

Umsetzung ist schon in Arbeit :)


Die Sonnenfinsternis nicht vergessen. Ruhig mal nen kurzen Moment aufstehen und an Fenster schleichen :D

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0][UMGT] Doppelte Anmeldungen verhindern

Beitrag von dave » 20.03.2015, 12:22:13

Die Sonnenfinsternis war unspektakulär langweilig. Dafür 20 Euro für eine Brille ausgeben?

Ich habe den Controller, das Template sowie die Labels.ini angepasst, sodass nun eine Fehlermeldung erscheint:
Der gewählte Benutzername/E-Mail-Adresse existiert bereits. Bitte wähle einen anderen Benutzernamen oder logge dich mit deinen Zugangsdaten ein.
Hier mal der geänderte Controller:

Code: Alles auswählen

<?php
/**
 * <!--
 * This file is part of the adventure php framework (APF) published under
 * http://adventure-php-framework.org.
 *
 * The APF is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * The APF is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with the APF. If not, see http://www.gnu.org/licenses/lgpl-3.0.txt.
 * -->
 */
namespace APF\modules\usermanagement\pres\documentcontroller\registration;

use APF\core\configuration\ConfigurationException;
use APF\core\logging\LogEntry;
use APF\core\logging\Logger;
use APF\core\singleton\Singleton;
use APF\modules\usermanagement\biz\model\UmgtGroup;
use APF\modules\usermanagement\biz\model\UmgtRole;
use APF\modules\usermanagement\biz\model\UmgtUser;
use APF\modules\usermanagement\pres\documentcontroller\UmgtBaseController;
use Exception;

/**
 * This document controller handles the user registration.
 *
 * @author Christian Achatz
 * @version
 * Version 0.1, 16.09.2011<br />
 */
class RegistrationController extends UmgtBaseController {

   public function transformContent() {

      $form = & $this->getForm('register');

      if ($form->isSent() && $form->isValid()) {

         $uM = $this->getManager();

         $user = new UmgtUser();

         $firstName = $form->getFormElementByName('firstname');
         $firstNameValue = $firstName->getValue();
         $user->setFirstName($firstNameValue);

         $lastName = $form->getFormElementByName('lastname');
         $lastNameValue = $lastName->getValue();
         $user->setLastName($lastNameValue);

         $street = $form->getFormElementByName('street');
         $user->setStreetName($street->getValue());

         $number = $form->getFormElementByName('number');
         $user->setStreetNumber($number->getValue());

         $zip = $form->getFormElementByName('zip');
         $user->setZIPCode($zip->getValue());

         $city = $form->getFormElementByName('city');
         $user->setCity($city->getValue());

         $email = $form->getFormElementByName('email');
         $user->setEMail($email->getValue());

         $userName = $form->getFormElementByName('username');
         $userNameValue = $userName->getValue();
         $user->setUsername($userNameValue);

         $password = $form->getFormElementByName('password');
         $user->setPassword($password->getValue());

         // assemble display name to have a more readable user within the umgt mgmt UI
         if (empty($firstNameValue) && empty($lastNameValue)) {
            $user->setDisplayName($userNameValue);
         } else {
            $user->setDisplayName($lastNameValue . ', ' . $firstNameValue);
         }

         // add initial groups and roles if applicable
         try {
            foreach ($this->getInitialGroups() as $initialGroup) {
               $user->addGroup($initialGroup);
            }

            foreach ($this->getInitialRoles() as $initialRole) {
               $user->addRole($initialRole);
            }
         } catch (ConfigurationException $e) {
            $l = & Singleton::getInstance('APF\core\logging\Logger');
            /* @var $l Logger */
            $l->logEntry('registration', 'Registration cannot add initial groups or roles due to the following '
               . 'exception: ' . $e . ' This may be ok, in case you have no initial groups and/or roles specified.',
               LogEntry::SEVERITY_INFO);
         }

         try {

            // Lets have a look if the username/email is always in use and show an error message
            try {
               $config = $this->getConfiguration('APF\modules\usermanagement\pres', 'login.ini');
               $section = $config->getSection('Default');
               $loginType = $section == null ? 'username' : $section->getValue('login.type');
            } catch (ConfigurationException $e) {
               $loginType = 'username';
            }

            if($loginType === 'username') {
               $regUser =  $uM->loadUserByUserName($userNameValue);
            }else{
               $regUser = $uM->loadUserByEMail($email->getValue());
            }

            if($regUser == null) {
               $uM->saveUser($user);
               $this->getTemplate('register-ok')->transformOnPlace();
            }else{
               $form->setPlaceHolder('register-error', $this->getTemplate('register-error-user-exist')->transformTemplate());
               $form->transformOnPlace();
            }

         } catch (Exception $e) {
            $this->getTemplate('system-error')->transformOnPlace();
            $l = & Singleton::getInstance('APF\core\logging\Logger');
            /* @var $l Logger */
            $l->logEntry('registration', 'Registration is not possible due to ' . $e, LogEntry::SEVERITY_ERROR);
         }
      } elseif ($form->isSent() && !$form->isValid()) {
         $form->setPlaceHolder('register-error', $this->getTemplate('register-error')->transformTemplate());
         $form->transformOnPlace();
      } else {
         $form->transformOnPlace();
      }

   }

   /**
    * Evaluates the user's initial groups that are applied during registration.
    *
    * @return UmgtGroup[] The list of initial groups.
    * @throws ConfigurationException In case of any misconfiguration.
    *
    * @author Christian Achatz
    * @version
    * Version 0.1 12.12.2011
    */
   private function getInitialGroups() {

      $config = $this->getConfiguration('APF\modules\usermanagement\pres', 'registration.ini');
      $section = $config->getSection('Default');

      if ($section === null) {
         throw new ConfigurationException('Section "default" is not defined within registration.ini');
      }

      $uM = $this->getManager();

      $groups = array();

      $initialGroups = $section->getSection('group');
      if ($initialGroups !== null) {
         foreach ($initialGroups->getValueNames() as $name) {
            $group = $uM->loadGroupByName($initialGroups->getValue($name));
            if ($group !== null) {
               $groups[] = $group;
            }
         }
      }

      return $groups;
   }

   /**
    * Evaluates the user's initial roles that are applied during registration.
    *
    * @return UmgtRole[] The list of initial roles.
    * @throws ConfigurationException In case of any misconfiguration.
    *
    * @author Christian Achatz
    * @version
    * Version 0.1 12.12.2011
    */
   private function getInitialRoles() {

      $config = $this->getConfiguration('APF\modules\usermanagement\pres', 'registration.ini');
      $section = $config->getSection('Default');

      if ($section === null) {
         throw new ConfigurationException('Section "default" is not defined within registration.ini');
      }

      $uM = $this->getManager();

      $roles = array();

      $initialRoles = $section->getSection('role');
      if ($initialRoles !== null) {
         foreach ($initialRoles->getValueNames() as $name) {
            $role = $uM->loadRoleByName($initialRoles->getValue($name));
            if ($role !== null) {
               $roles[] = $role;
            }
         }
      }

      return $roles;
   }

}
@Christian: Wäre nett, wenn du dir das einmal anschauen magst und mich auf Änderungen hinweist, sollte etwas unschön sein. Funktion ist in jedem Fall Ok ;)

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: [3.0][UMGT] Doppelte Anmeldungen verhindern

Beitrag von dr.e. » 21.03.2015, 00:44:50

Hallo dave,

habe die Implementierung etwas tweaked um die neue Config-Implementierung korrekt umzusetzen:

Code: Alles auswählen

namespace APF\modules\usermanagement\pres\documentcontroller\registration;

use APF\core\configuration\ConfigurationException;
use APF\core\logging\LogEntry;
use APF\core\logging\Logger;
use APF\core\singleton\Singleton;
use APF\modules\usermanagement\biz\model\UmgtGroup;
use APF\modules\usermanagement\biz\model\UmgtRole;
use APF\modules\usermanagement\biz\model\UmgtUser;
use APF\modules\usermanagement\pres\documentcontroller\UmgtBaseController;
use Exception;

/**
 * This document controller handles the user registration.
 *
 * @author Christian Achatz
 * @version
 * Version 0.1, 16.09.2011<br />
 */
class RegistrationController extends UmgtBaseController {

   public function transformContent() {

      $form = &$this->getForm('register');

      if ($form->isSent() && $form->isValid()) {

         $uM = $this->getManager();

         $user = new UmgtUser();

         $firstName = $form->getFormElementByName('firstname');
         $firstNameValue = $firstName->getValue();
         $user->setFirstName($firstNameValue);

         $lastName = $form->getFormElementByName('lastname');
         $lastNameValue = $lastName->getValue();
         $user->setLastName($lastNameValue);

         $street = $form->getFormElementByName('street');
         $user->setStreetName($street->getValue());

         $number = $form->getFormElementByName('number');
         $user->setStreetNumber($number->getValue());

         $zip = $form->getFormElementByName('zip');
         $user->setZIPCode($zip->getValue());

         $city = $form->getFormElementByName('city');
         $user->setCity($city->getValue());

         $email = $form->getFormElementByName('email');
         $user->setEMail($email->getValue());

         $userName = $form->getFormElementByName('username');
         $userNameValue = $userName->getValue();
         $user->setUsername($userNameValue);

         $password = $form->getFormElementByName('password');
         $user->setPassword($password->getValue());

         // assemble display name to have a more readable user within the umgt mgmt UI
         if (empty($firstNameValue) && empty($lastNameValue)) {
            $user->setDisplayName($userNameValue);
         } else {
            $user->setDisplayName($lastNameValue . ', ' . $firstNameValue);
         }

         // add initial groups and roles if applicable
         try {
            foreach ($this->getInitialGroups() as $initialGroup) {
               $user->addGroup($initialGroup);
            }

            foreach ($this->getInitialRoles() as $initialRole) {
               $user->addRole($initialRole);
            }
         } catch (ConfigurationException $e) {
            $l = &Singleton::getInstance('APF\core\logging\Logger');
            /* @var $l Logger */
            $l->logEntry('registration', 'Registration cannot add initial groups or roles due to the following '
                  . 'exception: ' . $e . ' This may be ok, in case you have no initial groups and/or roles specified.',
                  LogEntry::SEVERITY_INFO);
         }

         try {
            // Lets have a look if the username/email is always in use and show an error message
            try {
               $config = $this->getConfiguration('APF\modules\usermanagement\pres', 'login.ini');
               $loginType = $config->getSection('Default')->getValue('login.type', 'username');
            } catch (ConfigurationException $e) {
               $loginType = 'username';
            }

            if ($loginType === 'username') {
               $regUser = $uM->loadUserByUserName($userNameValue);
            } else {
               $regUser = $uM->loadUserByEMail($email->getValue());
            }

            if ($regUser === null) {
               $uM->saveUser($user);
               $this->getTemplate('register-ok')->transformOnPlace();
            } else {
               $form->setPlaceHolder('register-error', $this->getTemplate('register-error-user-exist')->transformTemplate());
               $form->transformOnPlace();
            }

         } catch (Exception $e) {
            $this->getTemplate('system-error')->transformOnPlace();
            $l = &Singleton::getInstance('APF\core\logging\Logger');
            /* @var $l Logger */
            $l->logEntry('registration', 'Registration is not possible due to ' . $e, LogEntry::SEVERITY_ERROR);
         }
      } elseif ($form->isSent() && !$form->isValid()) {
         $form->setPlaceHolder('register-error', $this->getTemplate('register-error')->transformTemplate());
         $form->transformOnPlace();
      } else {
         $form->transformOnPlace();
      }

   }

   /**
    * Evaluates the user's initial groups that are applied during registration.
    *
    * @return UmgtGroup[] The list of initial groups.
    * @throws ConfigurationException In case of any misconfiguration.
    *
    * @author Christian Achatz
    * @version
    * Version 0.1 12.12.2011
    */
   private function getInitialGroups() {

      $config = $this->getConfiguration('APF\modules\usermanagement\pres', 'registration.ini');

      $sectionName = 'Default';
      if (!$config->hasSection($sectionName)) {
         throw new ConfigurationException('Section "' . $sectionName . '" is not defined within registration.ini');
      }

      $section = $config->getSection($sectionName);

      $uM = $this->getManager();

      $groups = array();

      if ($section->hasSection('group')) {
         $initialGroups = $section->getSection('group');
         foreach ($initialGroups->getValueNames() as $name) {
            $group = $uM->loadGroupByName($initialGroups->getValue($name));
            if ($group !== null) {
               $groups[] = $group;
            }
         }
      }

      return $groups;
   }

   /**
    * Evaluates the user's initial roles that are applied during registration.
    *
    * @return UmgtRole[] The list of initial roles.
    * @throws ConfigurationException In case of any misconfiguration.
    *
    * @author Christian Achatz
    * @version
    * Version 0.1 12.12.2011
    */
   private function getInitialRoles() {

      $config = $this->getConfiguration('APF\modules\usermanagement\pres', 'registration.ini');

      $sectionName = 'Default';
      if (!$config->hasSection($sectionName)) {
         throw new ConfigurationException('Section "default" is not defined within registration.ini');
      }

      $section = $config->getSection($sectionName);

      $uM = $this->getManager();

      $roles = array();

      if ($section->hasSection('role')) {
         $initialRoles = $section->getSection('role');
         foreach ($initialRoles->getValueNames() as $name) {
            $role = $uM->loadRoleByName($initialRoles->getValue($name));
            if ($role !== null) {
               $roles[] = $role;
            }
         }
      }

      return $roles;
   }

} 
Wenn du mir Templates und Beispiel-konfigurationen noch zum Review schickst, kannst du es auch noch für 3.0 einchecken.
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0][UMGT] Doppelte Anmeldungen verhindern

Beitrag von dave » 21.03.2015, 15:27:21

Hi Christian,
im Anhang findest du ein ZIP mit dem geänderten Template und der *_labels.ini
Dateianhänge
APF.zip
(10.55 KiB) 39-mal heruntergeladen

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: [3.0][UMGT] Doppelte Anmeldungen verhindern

Beitrag von dr.e. » 22.03.2015, 15:52:03

Danke dir, schau's mir an und melde mich wieder.
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: [3.0][UMGT] Doppelte Anmeldungen verhindern

Beitrag von dr.e. » 22.03.2015, 16:38:28

Hallo dave,

danke für dein Engagement, freut mich, dass du das Feature übernommen hast! :)

Habe die Änderungen in den master eingecheckt, kannst dur unter https://github.com/AdventurePHP/code/archive/master.zip und https://github.com/AdventurePHP/config/ ... master.zip die neuen Sourcen ziehen.

Noch eine kleine Anmerkung: habe den Key für den Text in register.user.already-exists umbenannt, das klingt etwas sprechender.

Magst du die Änderungen bei dir lokal mal testen?
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0][UMGT] Doppelte Anmeldungen verhindern

Beitrag von dave » 22.03.2015, 17:28:35

Das klingt tatsächlich etwas passender ;)
Test erfolgreich. Alles wunderbar.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: [3.0][UMGT] Doppelte Anmeldungen verhindern

Beitrag von dr.e. » 23.03.2015, 14:25:36

Sehr schön! :)
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste