GitHub user dosubot[bot] added a comment to the discussion: How to customize authentication in version 6
<!-- Answer --> The "This transaction is closed" error combined with the fact that accessing `g.user.is_authenticated` mysteriously fixes it points to a **session/context initialization timing issue**. When you access `g.user`, it forces Flask-Login to fully initialize the request context and bind the session - which isn't happening automatically before your `request_loader` runs. This is a [known issue pattern with AUTH_REMOTE_USER in Superset 6](https://github.com/apache/superset/issues/36117). Try using `self.session` (the [FAB 5.x property](https://github.com/apache/superset/pull/35290)) instead of `db.session`, and force the session to be active before adding the user: ```python from flask import g class CustomSecurityManager(SupersetSecurityManager): def request_loader(self, request): username = request.environ.get("REMOTE_USER") if not username: return None # Force session initialization by accessing it _ = self.session user = self.find_user(username=username) if not user: log.info(f"Adding new user: {username}") try: user = self.add_user( username=username, first_name=request.environ.get("FIRST_NAME") or "", last_name=request.environ.get("LAST_NAME") or "", email=username, role=self.find_role("Gamma") ) self.session.commit() except Exception as e: self.session.rollback() log.error(f"Error creating user: {e}") return None # Re-fetch with fresh session user = self.find_user(username=username) return user ``` **If that still doesn't work**, the issue may be deeper in the request lifecycle. As a workaround, you could try creating users in a `before_request` handler instead of `request_loader`: ```python from flask import g, request as flask_request def before_request_handler(): username = flask_request.environ.get("REMOTE_USER") if username and not hasattr(g, '_user_checked'): g._user_checked = True sm = current_app.appbuilder.sm user = sm.find_user(username=username) if not user: # Create user here ... # In superset_config.py FLASK_APP_MUTATOR = lambda app: app.before_request(before_request_handler) ``` This moves user creation outside of Flask-Login's callback system, which might avoid the session timing issues you're hitting. <!-- Dosu Comment Footer --> *To reply, just mention [@dosu](https://go.dosu.dev/dosubot).* --- <sup>How did I do? [Good](https://app.dosu.dev/response-feedback/aa77b5c7-c68e-4546-a568-7b2d9dfdbd37?feedback_type=great_response) | [Irrelevant](https://app.dosu.dev/response-feedback/aa77b5c7-c68e-4546-a568-7b2d9dfdbd37?feedback_type=irrelevant_answer) | [Incorrect](https://app.dosu.dev/response-feedback/aa77b5c7-c68e-4546-a568-7b2d9dfdbd37?feedback_type=incorrect_sources) | [Verbose](https://app.dosu.dev/response-feedback/aa77b5c7-c68e-4546-a568-7b2d9dfdbd37?feedback_type=too_verbose) | [Hallucination](https://app.dosu.dev/response-feedback/aa77b5c7-c68e-4546-a568-7b2d9dfdbd37?feedback_type=hallucination) | [Report 🐛](https://app.dosu.dev/response-feedback/aa77b5c7-c68e-4546-a568-7b2d9dfdbd37?feedback_type=bug_report) | [Other](https://app.dosu.dev/response-feedback/aa77b5c7-c68e-4546-a568-7b2d9dfdbd37?feedback_type=other)</sup> [](https://app.dosu.dev/a28d3c7e-a9d3-459e-9fb6-3a6f9ff4f357/ask?utm_source=github) [](https://cursor.com/link/prompt?text=The%20%22This%20transaction%20is%20closed%22%20error%20combined%20with%20the%20fact%20that%20accessing%20%60g.user.is_authenticated%60%20mysteriously%20fixes%20it%20points%20to%20a%20%2A%2Asession/context%20initialization%20timing%20issue%2A%2A.%20When%20you%20access%20%60g.user%60%2C%20it%20forces%20Flask-Login%20to%20fully%20initialize%20the%20request%20context%20and%20bind%20the%20session%20-%20which%20isn%27t%20happening%20automatically%20before%20your%20%60request_loader%60%20runs.%0A%0AThis%20is%20a%20%5Bknown%20issue%20pattern%20with%20AUTH_REMOTE_USER%20in%20Superset%206%5D%28https%3A//github.com/apache/superset/issues/36117%29.%0A%0ATry%20using%20%60self.session%60%20%28the%20%5BFAB%205.x%20property%5D%28https%3A//github.com/apache/superset/p ull/35290%29%29%20instead%20of%20%60db.session%60%2C%20and%20force%20the%20session%20to%20be%20active%20before%20adding%20the%20user%3A%0A%0A%60%60%60python%0Afrom%20flask%20import%20g%0A%0Aclass%20CustomSecurityManager%28SupersetSecurityManager%29%3A%0A%20%20%20%20def%20request_loader%28self%2C%20request%29%3A%0A%20%20%20%20%20%20%20%20username%20%3D%20request.environ.get%28%22REMOTE_USER%22%29%0A%20%20%20%20%20%20%20%20if%20not%20username%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%23%20Force%20session%20initialization%20by%20accessing%20it%0A%20%20%20%20%20%20%20%20_%20%3D%20self.session%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20user%20%3D%20self.find_user%28username%3Dusername%29%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20if%20not%20user%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20log.info%28f%22Adding%20new%20user%3A%20%7Busername%7D%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20% 20%20%20%20%20%20%20%20%20%20%20%20%20user%20%3D%20self.add_user%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20username%3Dusername%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20first_name%3Drequest.environ.get%28%22FIRST_NAME%22%29%20or%20%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20last_name%3Drequest.environ.get%28%22LAST_NAME%22%29%20or%20%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20email%3Dusername%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20role%3Dself.find_role%28%22Gamma%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.session.commit%28%29%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.session.rollback%28%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20log.error%28f%22Error%20creating%20user%3A%20%7Be%7D%22%29%0A%20%20% 20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Re-fetch%20with%20fresh%20session%0A%20%20%20%20%20%20%20%20%20%20%20%20user%20%3D%20self.find_user%28username%3Dusername%29%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20return%20user%0A%60%60%60%0A%0A%2A%2AIf%20that%20still%20doesn%27t%20work%2A%2A%2C%20the%20issue%20may%20be%20deeper%20in%20the%20request%20lifecycle.%20As%20a%20workaround%2C%20you%20could%20try%20creating%20users%20in%20a%20%60before_request%60%20handler%20instead%20of%20%60request_loader%60%3A%0A%0A%60%60%60python%0Afrom%20flask%20import%20g%2C%20request%20as%20flask_request%0A%0Adef%20before_request_handler%28%29%3A%0A%20%20%20%20username%20%3D%20flask_request.environ.get%28%22REMOTE_USER%22%29%0A%20%20%20%20if%20username%20and%20not%20hasattr%28g%2C%20%27_user_checked%27%29%3A%0A%20%20%20%20%20%20%20%20g._user_checked%20%3D%20True%0A%20%20%20%20%20%20%20%20sm%20%3D%20 current_app.appbuilder.sm%0A%20%20%20%20%20%20%20%20user%20%3D%20sm.find_user%28username%3Dusername%29%0A%20%20%20%20%20%20%20%20if%20not%20user%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Create%20user%20here%0A%20%20%20%20%20%20%20%20%20%20%20%20...%0A%0A%23%20In%20superset_config.py%0AFLASK_APP_MUTATOR%20%3D%20lambda%20app%3A%20app.before_request%28before_request_handler%29%0A%60%60%60%0A%0AThis%20moves%20user%20creation%20outside%20of%20Flask-Login%27s%20callback%20system%2C%20which%20might%20avoid%20the%20session%20timing%20issues%20you%27re%20hitting.) [](https://go.dosu.dev/discord-bot) [](https://twitter.com/intent/tweet?text=%40dosu_ai%20helped%20me%20solve%20this%20issue!&url=https%3A//github.com/apache/superset/discussions/38199) GitHub link: https://github.com/apache/superset/discussions/38199#discussioncomment-15904927 ---- This is an automatically sent email for [email protected]. To unsubscribe, please send an email to: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
