feat(wiki-config): disable local login after bootstrap (Variante B)

Nobody should log in manually. The job disables the local strategy as its final
step (with a still-valid JWT), so the login page offers only Authentik OIDC.
Re-runs without a DB reset find local disabled -> login returns None -> the job
exits cleanly (already configured). Break-glass = DB reset (finalize re-enables
local). Verified live: local login is BLOCKED after the run.
This commit is contained in:
Thore Cimbal
2026-08-12 12:00:00 +00:00
parent 81d66c25a0
commit f034eabdd6
+16 -10
View File
@@ -111,22 +111,23 @@ def finalize():
sys.exit("Normalmodus nicht erreicht")
def login() -> str:
def login():
# Gibt JWT zurück, oder None, wenn local deaktiviert ist (Variante B, bereits
# konfiguriert) — dann ist nichts zu tun.
d = gql(
'mutation($u:String!,$p:String!){authentication{login(username:$u,password:$p,'
'strategy:"local"){responseResult{succeeded message} jwt}}}',
variables={"u": ADMIN_EMAIL, "p": ADMIN_PW},
)["authentication"]["login"]
if not d["responseResult"]["succeeded"]:
sys.exit(f"Login fehlgeschlagen: {d['responseResult']['message']}")
return d["jwt"]
return d["jwt"] if d["responseResult"]["succeeded"] else None
def _set_strategies(jwt: str, oidc_config: list):
def _set_strategies(jwt: str, oidc_config: list, local_enabled: bool = True):
strategies = [
{ # local muss in der Liste bleiben (Admin nutzt es), sonst Fehler.
{ # local bleibt in der Liste (nicht löschbar, Admin hängt dran), wird aber
# am Ende deaktiviert (Variante B): kein manuelles Login mehr im Alltag.
"key": "local", "strategyKey": "local", "displayName": "Local",
"order": 0, "isEnabled": True, "selfRegistration": False,
"order": 0, "isEnabled": local_enabled, "selfRegistration": False,
"domainWhitelist": [], "autoEnrollGroups": [], "config": [],
},
{
@@ -158,8 +159,9 @@ def ensure_oidc(jwt: str):
"groupsClaim": "groups", "mapGroups": True,
}
oidc_config = [{"key": k, "value": json.dumps({"v": v})} for k, v in cfg.items()]
_set_strategies(jwt, oidc_config)
log("OIDC-Strategy gesetzt")
# letzter updateStrategies-Aufruf: OIDC setzen UND local deaktivieren.
_set_strategies(jwt, oidc_config, local_enabled=False)
log("OIDC-Strategy gesetzt, local-Login deaktiviert")
def group_id(jwt: str, name: str):
@@ -195,13 +197,17 @@ def main():
if in_setup_mode():
finalize()
jwt = login()
if jwt is None:
log("lokaler Login nicht möglich (local deaktiviert) — bereits konfiguriert, Ende.")
return
log("eingeloggt")
ensure_oidc(jwt)
# Erst Gruppen (Schreibvorgänge), DANN OIDC — ensure_oidc deaktiviert zuletzt local.
# authentik Admins: alles lesen+schreiben. wiki-anwender: nur /anwender lesen.
ensure_group(jwt, "authentik Admins", ADMIN_PERMS, [rule("adm", False, ["read:pages", "write:pages", "manage:pages"], "")])
ensure_group(jwt, "wiki-anwender", READER_PERMS, [rule("anw", False, READER_PERMS, "anwender")])
# Guests (id 2) alle Rechte entziehen — Login-Pflicht, keine öffentliche Sicht.
gql('mutation{groups{update(id:2,name:"Guests",redirectOnLogin:"/",permissions:[],pageRules:[]){responseResult{succeeded}}}}', jwt)
ensure_oidc(jwt)
log("fertig — Wiki.js konfiguriert")