From e89dd03eb8b12be711f4609c5377ff982e9f19ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Fri, 21 Oct 2022 22:10:42 +0200 Subject: [PATCH] further details of description --- .../UC_Manuel_User_Registration.md | 130 ++++++++++++++---- .../UC_ManuelleUserRegistrierung.bmpr | Bin 971776 -> 971776 bytes .../image/Admin-CreateUser.png | Bin 46350 -> 48617 bytes 3 files changed, 107 insertions(+), 23 deletions(-) diff --git a/docu/Concepts/BusinessRequirements/UC_Manuel_User_Registration.md b/docu/Concepts/BusinessRequirements/UC_Manuel_User_Registration.md index a1f083832..156c1e0a1 100644 --- a/docu/Concepts/BusinessRequirements/UC_Manuel_User_Registration.md +++ b/docu/Concepts/BusinessRequirements/UC_Manuel_User_Registration.md @@ -23,7 +23,7 @@ Für diesen Fall wird im Admin-Interface eine neue Funktionalität zur "manuelle #### Vorbedingungen -Nach dem der neu User für sich schon die Erfassung seiner persönlichen Daten im Registrierungsdialog durchgeführt und gespeichert hat, schickt die Anwendung dem User eine Confirmation-Email an seine angegebene Email-Adresse. Der User kommt aber aktuell nicht an seine Emails bzw. benötigt Unterstützung, wie er jetzt weiter machen soll, um sich anzumelden. Mit diesem Bedarf nach Unterstützung wendet der User sich an einen Moderator mit entsprechenden Admin-Rechten. +Nach dem der neue User für sich schon die Erfassung seiner persönlichen Daten im Registrierungsdialog durchgeführt und gespeichert hat, schickt die Anwendung dem User eine Confirmation-Email an seine angegebene Email-Adresse. Der User kommt aber aktuell nicht an seine Emails bzw. benötigt Unterstützung, wie er jetzt weiter machen soll, um sich anzumelden. Mit diesem Bedarf nach Unterstützung wendet der User sich an einen Moderator mit entsprechenden Admin-Rechten. #### Manuelle Aktivierung und One-Time-Passwort @@ -43,7 +43,7 @@ Sobald der gewünschte User-Account in der Liste gefunden wurde, kann der Detail Der geöffnete Detail-Dialog zeigt einen neuen Reiter "Registrierung", in dem die Informationen über das User-Konto stehen: wann wurde es erzeugt und wie ist der Status der "Konto-Aktivierung" und der "Email-Bestätigung". -Der Admin kann nun entweder manuell ein One-Time-Passwort manuell in das Eingabefeld eingeben oder über den "erzeugen"-Button eines kreieren lassen. Diese wird dann über den Button "speichern & Konto aktivieren" in die Datenbank geschrieben. +Der Admin kann nun entweder manuell ein One-Time-Passwort in das Eingabefeld eingeben oder über den "erzeugen"-Button eines kreieren lassen. Dieses wird dann über den Button "speichern & Konto aktivieren" in die Datenbank geschrieben, wobei damit gleichzeitig der Status des User-Kontos auf aktiviert gesetzt wird. Der Admin kann nun das One-Time-Passwort dem User mitteilen, so dass dieser sich über den Login-Prozess in seinen Account ohne vorherige Email-Bestätigung anmelden kann. Der Login-Prozess mit einem One-Time-Passwort muss nach erfolgreicher Anmeldung den User sofort auf den Passwort-Ändern-Dialog führen, um den User direkt die Möglichkeit zu geben sein eigenes Passwort zu vergeben. @@ -55,7 +55,7 @@ Falls ein neuer User sein erhaltenes One-Time-Passwort noch nicht für einen Log ![img](./image/Admin-UserAccount-ActivatedOneTimePasswort.png) -Beim Öffnen der Userkonto-Details im Reiter "Registrierung" ist dann zu sehen, dass das "Konto schon aktiv", aber die "Email-Bestätigung noch offen" ist. Im Eingabefeld des One-Time-Passwortes ist das zuvor schon gespeicherte Passwort zu lesen, so dass der Admin dieses dem User mitteilen kann. Der Admin kann aber auch über den "erzeugen"-Button oder manuell das vorhandene Passwort ändern und über den "speichern"-Button dann in die Datenbank schreiben. +Beim Öffnen der Userkonto-Details im Reiter "Registrierung" ist dann zu sehen, dass das "Konto schon aktiv", aber die "Email-Bestätigung noch offen" ist. Im Eingabefeld des One-Time-Passwortes ist das zuvor schon gespeicherte Passwort zu lesen, so dass der Admin dieses dem User erneut mitteilen kann. Der Admin kann aber auch über den "erzeugen"-Button oder manuell das vorhandene Passwort ändern. Über den "speichern"-Button, der aufgrund der vorherigen Konto-Aktivierung nun nicht mehr "speichern & Konto aktivieren" heißt, kann die Passwort-Änderung in die Datenbank geschrieben werden. ### 1.2 Starten einer manuellen Admin-User-Registrierung @@ -63,9 +63,9 @@ Im Admin-Interface wird im Menü ein neuer Reiter "Registrierung" angezeigt. Mit ![img](./image/Admin-CreateUser.png) -Dabei kann der Moderator die Attribute Vorname, Nachname, Email-Adresse und ein One-Time-Passwort eingeben. Mit dem "speichern"-Button wird im Backend zunächst eine Prüfung durchgeführt, ob die eingegebene Email-Adresse ggf. schon von einem anderen existierenden User verwendet wird. Sollte dies der Fall sein, dann wird eine entsprechend aussagekräftige Fehlermeldung ausgegeben und die zuvor eingegebenen Daten werden in dem "Manuelle User-Registrierung" erneut angezeigt. Sind alle Daten soweit valide, dann werden die eingegebenen Daten in der Datenbank gespeichert. +Dabei kann der Moderator die Attribute Vorname, Nachname, Email-Adresse und ein One-Time-Passwort eingeben. Mit dem "speichern & Konto aktivieren"-Button wird im Backend zunächst eine Prüfung durchgeführt, ob die eingegebene Email-Adresse ggf. schon von einem anderen existierenden User verwendet wird. Sollte dies der Fall sein, dann wird eine entsprechend aussagekräftige Fehlermeldung ausgegeben und die zuvor eingegebenen Daten werden in dem "Manuelle User-Registrierung" erneut angezeigt. Sind alle Daten soweit valide, dann werden die eingegebenen Daten in der Datenbank gespeichert und der Konto-Status auf aktiviert gesetzt. -Es wird auch hier eine Email zur Emailadress-Bestätigung verschickt. Durch das One-Time-Passwort, das der Moderator dem User mitteilen kann, hat der User direkt die Möglichkeit sich über den Login-Prozess anzumelden, ohne vorher den Email-Bestätigungslink aktivieren zu müssen. +Es wird auch hier eine Email zur Emailadress-Bestätigung verschickt. Der Status "email_checked" bleibt auf false, weil der User seine Confirmation-Email zwar bekommen, aber noch nicht bestätigt hat oder eben nicht zeitnah bestätigen kann. Durch das One-Time-Passwort, das der Moderator dem User mitteilen kann, hat der User direkt die Möglichkeit sich über den Login-Prozess anzumelden, ohne vorher den Email-Bestätigungslink aktivieren zu müssen. ### 1.3 User-Login mit One-Time-Passwort @@ -75,9 +75,9 @@ Die Anwendung erkennt, dass der Login über ein One-Time-Passwort erfolgte, so d ![img](./image/One-Time-Passwort-Login.png) -Auf dieser Seite muss der User dann sein neues, nur ihm persönlich bekanntes Passwort eingeben und zur Kontrolle wiederholen. Da der User-Account über eine One-Time-Passwort Registrierung erstellt wurde, hatte der User sehr wahrscheinlich nicht selbst die Gelegenheit der Datenschutzerklärung selbst zuzustimmen. Daher wird hier im Passwort-Ändern-Dialog dies nachgeholt, indem erst mit der Zustimmung zur Datenschutzerklärung der "Passwort ändern"-Button aktiviert wird. +Auf dieser Seite muss der User dann sein neues, nur ihm persönlich bekanntes Passwort eingeben und zur Kontrolle wiederholen. Da der User-Account über eine One-Time-Passwort Registrierung erstellt wurde, hatte der User sehr wahrscheinlich nicht die Gelegenheit der Datenschutzerklärung selbst zuzustimmen. Daher wird hier im Passwort-Ändern-Dialog dies nachgeholt, indem erst mit der Zustimmung zur Datenschutzerklärung der "Passwort ändern"-Button aktiviert wird. -## 2. Backend Anpassungen +## 2. Implementierung und Anpassungen ### 2.1 Datenbank @@ -98,17 +98,17 @@ Ansonsten werden aber keine weiteren Datenbank-Migrationen, wie Zuordnung der Tr #### accounts-Tabelle -| Column | Type | Description | -| ----------------- | ---------------- | ----------------------------------------------------------------------------- | -| id | unsigned int(10) | technical unique key | -| user_id | unsigned int(10) | foreign key to users entry | -| type | enum | account type: AGE (default), AGW, AUF | -| created_at | datetime(3) | the point of time the entry was created | -| activated | tinyint(4) | switch if account is active or inactive | -| creations_allowed | tinyint(4) | switch if account allows to create gradidos or not | -| decay | tinyint(4) | switch if account supports decay or not | -| balance | decimal(40, 20) | amount of gradidos at the updated_at point of time | -| updated_at | datetime(3) | the point of time the entry was updated, especially important for the balance | +| Column | Type | Description | +| ----------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------- | +| id | unsigned int(10) | technical unique key | +| user_id | unsigned int(10) | foreign key to users entry | +| type | enum | account type: AGE (default), AGW, AUF | +| created_at | datetime(3) | the point of time the entry was created | +| activated | tinyint(4) | switch if account is active or inactive | +| creations_allowed | tinyint(4) | switch if account allows to create gradidos or not; necessary for type AGW and AUF | +| decay | tinyint(4) | switch if account supports decay or not; in case the GDT will be shiftet as a separate account type here in the application | +| balance | decimal(40, 20) | amount of gradidos at the updated_at point of time | +| updated_at | datetime(3) | the point of time the entry was updated, especially important for the balance | Die letzten vier Spalten sind ersteinmal rein informativ, was ein `accounts`-Eintrag zukünftig enthalten wird und für diesen Usecase optional. Sie könnten auch auf ein zukünftiges Migrations-Issue verschoben werden. @@ -121,26 +121,110 @@ Die letzten vier Spalten sind ersteinmal rein informativ, was ein `accounts`-Ein Um zu vermeiden, dass in Bezug auf das One-Time-Passwort und der anstehenden Migration der Passwort-Verschlüsselung ohne Email und stattdessen per GradidoID, es hier zu unnötigen Tabellen-Migrationen kommt, wird mit diesem Usecase die Spalte *password_encryption_type* eingeführt. Damit ist dann erkennbar, ob es sich bei dem gespeicherten Passwort um ein One-Time-Passwort handelt oder um ein anderweitig verschlüsseltes Passwort. -Sollte das Issue zur Migration der Passwort-Verschlüsselung schon vor diesem Usecase umgesetzt sein, dann existiert in der `users`-Tabelle schon die Spalte `passphrase_encryption_type`. Dann sollte diese in `password_encryption_type` umbenannt und dem Enum der Wert 0 für One-Time-Passwort hinzugefügt werden. +Sollte das Issue zur Migration der Passwort-Verschlüsselung schon vor diesem Usecase umgesetzt sein, dann existiert in der `users`-Tabelle schon die Spalte `passphrase_encryption_type`. Dann sollte diese in `password_encryption_type` umbenannt und dem Enum der Wert 0 für One-Time-Passwort hinzugefügt werden. Die Bezeichnung *passphrase_encryption_type* ist irreführend, da in der Tabelle eine Spalte `passphrase `existiert. Doch die Verschlüsselung wird auf die Spalte `password `und nicht auf `passphrase` angewendet. + +#### Migration + +Mit den zuvor beschriebenen Datenbankänderungen muss eine Datenbankmigration auf die bestehenden Daten durchgeführt werden. Nachdem die strukturellen Änderungen wie neue `accounts`-Tabelle anlegen und bestehende `users`-Tabelle ändern durchgeführt wurde, erfolgt nun die eigentliche Migration der Daten: + +* erzeugen der neuen `accounts`-Tabelle wie oben beschrieben +* ändern der bestehenden `users`-Tabelle wie oben beschrieben mit folgenden Default-Initialisierungen + * privacy_policy_at = created_at + * passwort_encryption_type = Enum `PasswordEncryptionType.EMAIL` oder Wert=1 +* Insert pro Eintrag aus der `users`-Tabelle jeweils einen Eintrag in die `accounts`-Tabelle mit folgenden Initialsisierungen: + * `accounts.user_id` = `users.id` + * `accounts.type` = Enum `AccountType.AGE` + * `accounts.created_at` = `users.created_at` + * `accounts.activated` = `users.emailContact.email_checked` + * `accounts.creations_allowed` = TRUE (weil es ein account type = AGE ist) + * `accounts.decay` = TRUE (weil es ein account type = AGE ist) + * `accounts.balance` = null (dieses Attribut wird in separatem Issue "Update Account-Balance during writing a Transaction" bedient) + * `account.updated_at` = null (dieses Attribut wird in separatem Issue "Update Account-Balance during writing a Transaction" bedient) + + ### 2.2 Admin-Interface #### searchUsers -Der Service *searchUsers* muss die Filterkriterien "aktiviertes Konto" und "bestätigte Email" getrennt von einander unterstützen. Bisher gibt es in den *SearchUserFilters* das Filterkriterium "byActivated", doch diese wird auf das Flag in der `user_contacts`-Tabelle angewendet. Das entspricht dann dem FilterKriterium "bestätigte Email". +Der Service *AdminResolver.searchUsers* muss die Filterkriterien "aktiviertes Konto" und "bestätigte Email" getrennt von einander unterstützen. Bisher gibt es in den *SearchUserFilters* das Filterkriterium "byActivated", doch dieses wird auf das Flag `email_checked` in der `user_contacts`-Tabelle angewendet. Das entspricht aber dann dem FilterKriterium "bestätigte Email". -Somit wird noch ein weiteres Filterkriterium für "aktiviertes Konto" benötigt, das auf die Spalte "`activated`" in der `accounts`-Tabelle angewendet wird. +Somit muss das schon existierende Fitlerkriterium "aktiviertes Konto" auf die Spalte "`activated`" in der `accounts`-Tabelle angewendet werden und ein zusätzliches Filterkriterium "bestätigte Email", das auf die Spalte `email_checked` in der `user_contacts`-Tabelle filtert. -Der ErgebnisTyp `SearchUsersResult `muss um die Informationen erweitert werden, die in dem oben aufgezeigten Detail-Dialog der *Nutzer-Suche* auf dem Reiter "Registrierung" zur Anzeige gebracht werden müssen: +Der ErgebnisTyp `SearchUsersResult `des Service *searchUsers* muss um die Informationen erweitert werden, die in dem oben aufgezeigten Detail-Dialog der *Nutzer-Suche* auf dem Reiter "Registrierung" zur Anzeige gebracht werden: * Zeitpunkt der Konto-Erstellung (`accounts.created_at`) * Status des Kontos (`accounts.activated`) * Status der Email-Bestätigung (`user_contacts.email_checked`) * falls `users.password_encryption_type` = 0, dann das One-Time-Passwort (`users.password`) -#### createUser +#### adminCreateUser + +Im *AdminResolver* muss aus Berechtigungsgründen ein neuer Service *adminCreateUser* erstellt werden, da im *UserResolver* der Service *createUser* für jeden offen ist, ohne dass eine vorherige Authentifizierung per Login stattgefunden hat. + +Dieser neue Service benötigt folgende Signatur als Eingabeparameter: + +| Argument | Type | Bezeichnung | +| --------------- | ------ | ------------------------------------- | +| vorname | String | der Vorname des neuen Users | +| nachname | String | der Nachname des neuen Users | +| email | String | die Email-Adresse des neuen Users | +| oneTimePassword | String | das One-Time-Passwort des neuen Users | + + Der neue Service entspricht der internen Logik weitestgehend dem exitierenden Service `UserResolver.create`. + +* prüfen ob Email schon existiert und wenn ja, dann an diese Email eine Info-Nachricht und Abruch mit Fehlermeldung +* neues User-Objekt initialisieren mit + * GradidoID + * Vorname + * Nachname + * One-Time-Passwort mit gleichzeitigem Setzen von `password_encryption_type` = Enum `PasswordEncryptionType.ONETIME` +* das neue User-Objekt speichern +* neues UserContact-Objekt initialisieren mit + * Email + * vorherige userID +* das neue UserContact-Objekt speichern +* die erhaltene ID des neuen UserContact-Eintrags in den vorher erzeugten User-Eintrag als emailContactID schreiben +* einen EventProtokoll-Eintrag schreiben vom Typ *EventAdminRegister*, der neu anzulegen ist und von `EventBasicUserId `abgeleitet wird, aber zusätzlich die *UserId* des Moderators in das Attribut `xUserId `einträgt. +* die Confirmation-Email zur Bestätigung der Email-Adresse verschicken +* alle fachlich sonst notwendigen Eventprotokolle schreiben + +Alle logischen Schritte bzgl. einer PublisherID oder eines Redeem-Links bleiben hier in diesem Service aussen vor. + +Als Rückgabe sind erst einmal keine weiteren fachlichen Daten geplant, ausser einem Boolean=TRUE für eine evtl. Erfolgsmeldung. Im Fehlerfall wird der Service mit einer Exception beendet. + +#### adminUpdateUser + +Im *AdminResolver* wird der neue Service *adminUpdateUser* eingeführt, um für einen schon existierenden User das One-Time-Passwort zu aktualisieren. Über die vorher durchgeführte Nutzer-Suche sind die aktuell gespeicherten Userdaten schon ermittelt worden. Damit ergibt sich als Signatur für diesen Service folgendes: + +| Argument | Typ | Beschreibung | +| -------- | ------ | -------------------------------------------------------- | +| userId | number | der technisch eindeutige Identifer des betroffenen Users | +| password | String | das geänderte One-Time-Passwort | + +Dieser Service führt mit der übergebenen *userId* ein update auf dem *User* aus. Dazu wird bei der Aktualisierung das Kriterium `passwort_encryption_type` = Enum `PasswordEncryptionType.ONETIME` sichergestellt und das Attribut `password `mit dem übergebenen Parameter *password* sowie das Flag `activated `= TRUE gesetzt. Abschließend erfolgt das Schreiben eines EventProtokoll-Eintrags vom Typ *EventAdminPasswortChange*, der neu anzulegen ist und von `EventBasicUserId `abgeleitet wird, aber zusätzlich die *UserId* des Moderators in das Attribut `xUserId `einträgt. + +Als Rückgabe sind erst einmal keine weiteren fachlichen Daten geplant, ausser einem Boolean=TRUE für eine evtl. Erfolgsmeldung. Im Fehlerfall wird der Service mit einer Exception beendet. + +### 2.3 User-Interface + +#### login + +Im *UserResolver* muss der Service *login* angepasst werden, um eine Anmeldung per One-Time-Passwort zu erlauben. + +Dabei wird zuerst per übergebener *email* der User aus der Datenbank ermittelt. Bevor die Prüfung auf das Flag `user.emailContact.email_checked` erfolgt, muss eine Prüfung auf das Attribut `user.password_encryption_type` durchgeführt werden. Ist die Passwort-Verschlüsselung dieses Users auf dem Wert `PasswordEncryptionType.ONETIME`, dann wird die Prüfung des Flags `user.emailContact.email_checked` übersprungen. + +Durch den Wert des Attributs `user.password_encryption_type` wird die Passwort-Entschlüsselungsart und Prüfung gesteuert. Beim Wert `PasswordEncryptionType.ONETIME` ist das Passwort selbst für die Anwendung kein Geheimnis, da dieses durch einen Moderator und nicht geheim durch den User eingegeben wurde und jederzeit durch einen Moderator im Klartext wieder angezeigt werden kann. + +Wenn zuvor es sich um ein Login per One-Time-Passwort handelte, dann erfolgt keine Überprüfung des EloPage-Status und Aktuallisierung der PublisherId. + +Mit erfolgreicher Beendigung des Login-Service wird der User mit seinen aktuellen Attrubtwerten zurückgeliefert. Dabei ist nun im Frontend sicherzustellen, dass wenn im User das Attribut `user.password_encryption_type` den Wert `PasswordEncryptionType.ONETIME` hat, dass dann mit Verlassen des Login-Dialogs der Anwender direkt nur auf die Passwort-Ändern-Seite geführt wird. +#### changePassword + + +um das *One-Time-Passwort* als optionales Argument erweitert werden. Sobald dieses Argument ## Brainstorming von Bernd diff --git a/docu/Concepts/BusinessRequirements/graphics/UC_ManuelleUserRegistrierung.bmpr b/docu/Concepts/BusinessRequirements/graphics/UC_ManuelleUserRegistrierung.bmpr index 07a82d77b9cd06b9a97457664ca93480e22c0e12..885ce6762e4d23d3960c5ef415d337db11a1b111 100644 GIT binary patch delta 29136 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 GqJILO0KDh` delta 12642 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 delta 7016 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