You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by mi...@apache.org on 2026/04/13 19:05:11 UTC
(superset) 06/45: fix(mcp): remove JWT ValueError g.user fallback in auth layer (#39106)
This is an automated email from the ASF dual-hosted git repository.
michaelsmolina pushed a commit to branch 6.1
in repository https://gitbox.apache.org/repos/asf/superset.git
commit bc8690187ff02049b38e5d10075951937837aa89
Author: Amin Ghadersohi <am...@gmail.com>
AuthorDate: Mon Apr 6 12:35:46 2026 -0400
fix(mcp): remove JWT ValueError g.user fallback in auth layer (#39106)
(cherry picked from commit 92747246fc7e562eef527034e8fcceec50aad9ab)
---
superset/mcp_service/auth.py | 27 +++++++++------------------
1 file changed, 9 insertions(+), 18 deletions(-)
diff --git a/superset/mcp_service/auth.py b/superset/mcp_service/auth.py
index df171523966..b029c4f8484 100644
--- a/superset/mcp_service/auth.py
+++ b/superset/mcp_service/auth.py
@@ -337,26 +337,17 @@ def _setup_user_context() -> User | None:
_cleanup_session_on_error()
continue
logger.error("DB connection failed on retry during user setup: %s", e)
+ _cleanup_session_on_error()
raise
except ValueError as e:
- # JWT user resolution failed (e.g. SAML subject not in DB).
- # Log a security warning but fall back to middleware-provided
- # g.user if available. This handles cases where the JWT
- # resolver username format doesn't match the DB username
- # (e.g., SAML subject vs email). A separate story should
- # investigate whether any deployments hit this path and
- # migrate them before removing the fallback entirely.
- if has_request_context() and hasattr(g, "user") and g.user:
- logger.warning(
- "SECURITY: JWT user resolution failed (%s), falling "
- "back to middleware-provided g.user=%s. This fallback "
- "should be investigated and removed once all "
- "deployments use consistent username resolution.",
- e,
- g.user.username,
- )
- user = g.user
- break
+ # User resolution failed — fail closed. Do not fall back to
+ # g.user from middleware, as that could allow a request to
+ # proceed as a different user in multi-tenant deployments.
+ # Clear g.user so error/audit logging doesn't attribute
+ # the denied request to the middleware-provided identity.
+ logger.error("MCP user resolution failed, denying request: %s", e)
+ if has_request_context():
+ g.pop("user", None)
raise
g.user = user