88# =============================================================================
99import os
1010from flask_appbuilder .security .manager import AUTH_OAUTH
11+ from superset .security import SupersetSecurityManager
1112
1213# ── Core ────────────────────────────────────────────────────────────────────
1314ENABLE_PROXY_FIX = True
@@ -64,9 +65,19 @@ class CeleryConfig:
6465
6566# ── Authentik OIDC ─────────────────────────────────────────────────────────
6667DOMAIN = os .environ .get ("DOMAIN" , "acumenus.net" )
68+ AUTHENTIK_ADMIN_GROUPS = {
69+ "authentik Admins" ,
70+ "Parthenon Admins" ,
71+ "Aurora Admins" ,
72+ }
6773AUTH_TYPE = AUTH_OAUTH
6874AUTH_USER_REGISTRATION = True
69- AUTH_USER_REGISTRATION_ROLE = "Public"
75+ AUTH_USER_REGISTRATION_ROLE = "Gamma"
76+ AUTH_ROLES_SYNC_AT_LOGIN = True
77+ AUTH_ROLES_MAPPING = {
78+ "Admin" : ["Admin" ],
79+ "Gamma" : ["Gamma" ],
80+ }
7081OAUTH_PROVIDERS = [
7182 {
7283 "name" : "authentik" ,
@@ -79,11 +90,34 @@ class CeleryConfig:
7990 "access_token_url" : f"https://auth.{ DOMAIN } /application/o/token/" ,
8091 "authorize_url" : f"https://auth.{ DOMAIN } /application/o/authorize/" ,
8192 "server_metadata_url" : f"https://auth.{ DOMAIN } /application/o/superset-oidc/.well-known/openid-configuration" ,
82- "client_kwargs" : {"scope" : "openid profile email" },
93+ "client_kwargs" : {"scope" : "openid profile email groups " },
8394 },
8495 }
8596]
8697
98+
99+ class AuthentikSecurityManager (SupersetSecurityManager ):
100+ def oauth_user_info (self , provider , response = None ):
101+ if provider != "authentik" :
102+ return super ().oauth_user_info (provider , response )
103+
104+ remote = self .appbuilder .sm .oauth_remotes [provider ]
105+ userinfo = remote .get ("userinfo" ).json ()
106+ groups = userinfo .get ("groups" ) or []
107+ name = userinfo .get ("name" ) or userinfo .get ("preferred_username" ) or userinfo .get ("email" )
108+ role_key = "Admin" if any (group in AUTHENTIK_ADMIN_GROUPS for group in groups ) else "Gamma"
109+ return {
110+ "username" : userinfo .get ("preferred_username" ) or userinfo .get ("email" ),
111+ "name" : name ,
112+ "email" : userinfo .get ("email" ),
113+ "first_name" : name ,
114+ "last_name" : "" ,
115+ "role_keys" : [role_key ],
116+ }
117+
118+
119+ CUSTOM_SECURITY_MANAGER = AuthentikSecurityManager
120+
87121# ── Display ─────────────────────────────────────────────────────────────────
88122APP_NAME = "Acropolis Analytics"
89123SUPERSET_WEBSERVER_TIMEOUT = 300
0 commit comments