Login nur fuer Mitarbeiter (Label), Kunden-Konten werden abgewiesen
Kunden haben Konten im selben Appwrite-Projekt und konnten sich mit ihrem Portal-Passwort im Ticketsystem anmelden; dabei entstand sogar automatisch ein employees-Eintrag. - lib/staffAccess.js: Zugang nur mit Label "mitarbeiter" oder "admin" - AuthContext: Konto ohne Label -> Sitzung sofort beenden, Hinweis aufs Kundenportal (Login, Neuladen, nach dem 2FA-Code); employees-Eintrag nur noch fuer Mitarbeiter - setup-legal.mjs: Rechte nur fuer die Labels (ein erneuter Lauf oeffnet nichts mehr fuer "users") Die eigentliche Sperre sind die Appwrite-Rechte (Kundenportal scripts/mitarbeiter-zugang.mjs --rechte). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
65e9931f2c
commit
78bc99a73b
5 files changed
+87
-6
No files matched your search
@@ -11,6 +11,7 @@ import {
|
||||
client,
|
||||
} from '../lib/appwrite'
|
||||
import { createMfaApi, isMoreFactorsError, maskEmail, mfaErrorMessage } from '../lib/mfa'
|
||||
import { isStaffAccount, NO_STAFF_ACCESS } from '../lib/staffAccess'
|
||||
|
||||
const AuthContext = createContext()
|
||||
const mfa = createMfaApi(client)
|
||||
@@ -52,8 +53,16 @@ async function createSessionWithCleanup(email, password) {
|
||||
}
|
||||
}
|
||||
|
||||
// Hilfsfunktion: Fügt User automatisch zur employees Collection hinzu und liefert
|
||||
// den Mitarbeiter-Eintrag (Kürzel = Gitea-Name, siehe isWorksheetCreator) oder null
|
||||
// Konto ohne Mitarbeiter-Label (z. B. Kunde mit Portal-Passwort): Sitzung sofort beenden
|
||||
async function endSession() {
|
||||
try {
|
||||
await account.deleteSession('current')
|
||||
} catch { /* Sitzung ggf. schon weg */ }
|
||||
clearAllLocalAppwriteSessions()
|
||||
}
|
||||
|
||||
// Hilfsfunktion: Fügt einen Mitarbeiter (nur nach isStaffAccount) automatisch zur employees Collection hinzu und
|
||||
// liefert den Mitarbeiter-Eintrag (Kürzel = Gitea-Name, siehe isWorksheetCreator) oder null
|
||||
async function ensureEmployeeExists(user) {
|
||||
if (!user) return null
|
||||
|
||||
@@ -109,6 +118,11 @@ export function AuthProvider({ children }) {
|
||||
|
||||
try {
|
||||
const session = await account.get()
|
||||
if (!isStaffAccount(session)) {
|
||||
await endSession()
|
||||
setUser(null)
|
||||
return
|
||||
}
|
||||
setUser(session)
|
||||
setEmployee(await ensureEmployeeExists(session))
|
||||
} catch (error) {
|
||||
@@ -147,6 +161,10 @@ export function AuthProvider({ children }) {
|
||||
const sent = await sendCode()
|
||||
return { success: false, mfaRequired: true, error: sent.error }
|
||||
}
|
||||
if (!isStaffAccount(session)) {
|
||||
await endSession()
|
||||
return { success: false, error: NO_STAFF_ACCESS }
|
||||
}
|
||||
setUser(session)
|
||||
setEmployee(await ensureEmployeeExists(session))
|
||||
|
||||
@@ -191,6 +209,11 @@ export function AuthProvider({ children }) {
|
||||
try {
|
||||
await mfa.completeChallenge(mfaPending.challengeId, String(otp || '').trim())
|
||||
const session = await account.get()
|
||||
if (!isStaffAccount(session)) {
|
||||
await endSession()
|
||||
setMfaPending(null)
|
||||
return { success: false, error: NO_STAFF_ACCESS }
|
||||
}
|
||||
setUser(session)
|
||||
setEmployee(await ensureEmployeeExists(session))
|
||||
setMfaPending(null)
|
||||
|
||||
Reference in new issue
Block a user