fix(api): erzwungenen Passwortwechsel an der API wirklich durchsetzen
JwtStrategy.validate liess mustChangePassword auf dem Weg vom Token zu request.user fallen; der global registrierte ForcePasswordChangeInterceptor prueft genau dieses Feld und hat seit seiner Einfuehrung nie etwas blockiert. validate() reicht das Feld jetzt durch (strenger Vergleich mit true, Alt-Sitzungen ohne den Anspruch bleiben unveraendert unbetroffen). Zusaetzlich die Erlaubnisliste des Abfangers von Teilstring-Vergleich auf exakten Abgleich von Methode UND Pfad umgestellt (Absicherung gegen eine kuenftige kollidierende Route, heute nicht ausnutzbar). Nahttest gepinnt, der gegen den alten Quelltext nachweislich scheitert (6 von 12 neuen Faellen rot vor der Aenderung, gruen danach). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TPPB4ApQxzSU1rwV2Ffj9J
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { JwtStrategy } from './jwt.strategy';
|
||||
|
||||
/**
|
||||
* JwtStrategy.validate — pinnt die Durchreichung von mustChangePassword
|
||||
* (260921-fi3, Aufgabe 1, Befund 1/D-01). Direkte Konstruktion ohne
|
||||
* Nest-Testmodul, Muster aus `../../tenant/tenant.guard.spec.ts`.
|
||||
*/
|
||||
|
||||
function makeConfigService() {
|
||||
return { get: () => 'test-secret' } as any;
|
||||
}
|
||||
|
||||
describe('JwtStrategy.validate', () => {
|
||||
it('Anspruch mustChangePassword=true im Token: liefert request.user.mustChangePassword === true', async () => {
|
||||
const strategy = new JwtStrategy(makeConfigService());
|
||||
|
||||
const result = await strategy.validate({
|
||||
sub: 'u1',
|
||||
username: 'admin',
|
||||
role: 'ADMIN',
|
||||
tenantId: 't1',
|
||||
mustChangePassword: true,
|
||||
});
|
||||
|
||||
expect(result.mustChangePassword).toBe(true);
|
||||
});
|
||||
|
||||
it('Anspruch fehlt im Token (Alt-Sitzung, vor dieser Aenderung ausgestellt): liefert false statt undefined', async () => {
|
||||
const strategy = new JwtStrategy(makeConfigService());
|
||||
|
||||
const result = await strategy.validate({
|
||||
sub: 'u1',
|
||||
username: 'admin',
|
||||
role: 'ADMIN',
|
||||
tenantId: 't1',
|
||||
});
|
||||
|
||||
expect(result.mustChangePassword).toBe(false);
|
||||
});
|
||||
|
||||
it('id, username, role und tenantId werden unveraendert wie bisher durchgereicht', async () => {
|
||||
const strategy = new JwtStrategy(makeConfigService());
|
||||
|
||||
const result = await strategy.validate({
|
||||
sub: 'u1',
|
||||
username: 'nutzer1',
|
||||
role: 'USER',
|
||||
tenantId: 't2',
|
||||
mustChangePassword: false,
|
||||
});
|
||||
|
||||
expect(result).toEqual({
|
||||
id: 'u1',
|
||||
username: 'nutzer1',
|
||||
role: 'USER',
|
||||
tenantId: 't2',
|
||||
mustChangePassword: false,
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user