internal/pwpolicy: Validate ist eine schmale Regelschicht VOR dem bcrypt-Hashing aus IAM-02, kein eigenes Policy-Framework. Prueft Mindestlaenge, Zeichenklassen (Gross-/Kleinbuchstaben, Ziffern, Sonderzeichen je nach Policy) und eine eingebettete Sperrliste haeufig verwendeter Passwoerter (case-insensitive) — Akzeptanzkriterium 1 + 2. Store haelt die Richtlinie als eine Zeile je Tenant-Datenbank (Singleton, Modell C), DefaultPolicy() greift, solange kein Tenant eine eigene gesetzt hat. LoginAndCheckPolicy komponiert IAM-02s LoginService, OHNE ihn zu veraendern: der Login selbst schlaegt bei einem alten, nicht mehr konformen Passwort NICHT fehl (Akzeptanzkriterium 3 — kein rueckwirkendes Aussperren), die Funktion liefert zusaetzlich mustChangePassword=true. Die Pruefung ist nur im Login-Moment moeglich, da dort kurzzeitig das Klartext-Passwort vorliegt — der gespeicherte bcrypt-Hash laesst sich nicht rueckwirkend gegen eine neue Richtlinie pruefen. Pruefungen (ausgefuehrt auf root@192.168.1.131, go build/vet/test PASS): 1. Zu kurzes/zu einfaches Passwort bei Registrierung/Aenderung abgelehnt — TestValidate_RejectsTooShortOrSimple. PASS. 2. Passwort aus Sperrliste abgelehnt — TestValidate_RejectsBlocklistedPassword (inkl. Gross-/Kleinschreibung). PASS. 3. Bestehender Nutzer mit altem, nicht-konformem Passwort kann sich noch einloggen, wird aber zur Aenderung aufgefordert — TestLoginAndCheckPolicy_FlagsNonConformantExistingPassword: Login mit schwachem Altpasswort gelingt, mustChangePassword=true; mit konformem Passwort mustChangePassword=false. PASS. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
31 lines
1.1 KiB
Go
31 lines
1.1 KiB
Go
package pwpolicy
|
|
|
|
import (
|
|
"context"
|
|
|
|
"gitea.perlbach24.de/scripte/nexarch/internal/auth"
|
|
)
|
|
|
|
// LoginAndCheckPolicy komponiert IAM-02s LoginService mit der Passwort-
|
|
// Richtlinienpruefung, OHNE LoginService selbst zu veraendern. Ein
|
|
// bestehender Benutzer mit einem alten, nicht mehr konformen Passwort kann
|
|
// sich weiterhin einloggen (Login schlaegt NICHT fehl) — er wird lediglich
|
|
// zur Aenderung aufgefordert (Akzeptanzkriterium 3: kein rueckwirkendes
|
|
// Aussperren). Die Pruefung ist nur HIER moeglich, da nur beim Login das
|
|
// Klartext-Passwort kurzzeitig vorliegt — der gespeicherte bcrypt-Hash laesst
|
|
// sich nicht rueckwirkend gegen eine neue Richtlinie pruefen.
|
|
func LoginAndCheckPolicy(ctx context.Context, policies *Store, login *auth.LoginService, email, password string) (token string, mustChangePassword bool, err error) {
|
|
token, err = login.Login(ctx, email, password)
|
|
if err != nil {
|
|
return "", false, err
|
|
}
|
|
|
|
policy, err := policies.Get(ctx)
|
|
if err != nil {
|
|
return "", false, err
|
|
}
|
|
|
|
mustChangePassword = Validate(policy, password) != nil
|
|
return token, mustChangePassword, nil
|
|
}
|