GitHub user dosubot[bot] added a comment to the discussion: Multi-Tenant User
management
<!-- Answer -->
To override the roles dropdown (used in the add/edit user modal) for
tenant-based filtering—without disrupting other APIs and with
FAB_ADD_SECURITY_API enabled—subclass the RoleRestAPI and override its get_list
method. Register your subclass using FLASK_APP_MUTATOR so it only affects the
roles endpoint.
Here’s a pattern you can use (Superset 5.x):
```python
# In custom_role_api.py (do not import this at module level in
superset_config.py)
from flask import g
from superset.security.api import RoleRestAPI
from superset.extensions import security_manager
from superset.models.core import db
from sqlalchemy.orm import joinedload
class TenantRoleRestAPI(RoleRestAPI):
def get_list(self, **kwargs):
user_roles = [role.name for role in
security_manager.get_user_roles(g.user)]
query = db.session.query(self.datamodel.obj).options(
joinedload("permissions"), joinedload("user")
)
# Example: restrict to "Tenant-user" if current user is "Tenant-manager"
if "Tenant-manager" in user_roles:
query = query.filter(self.datamodel.obj.name == "Tenant-user")
# Continue with original pagination/filter logic
# ... (copy rest of RoleRestAPI.get_list logic here, using your
filtered query)
# Or call super() if you want to apply additional filters
return super().get_list(**kwargs)
```
Then, in your `superset_config.py`:
```python
def FLASK_APP_MUTATOR(app):
from custom_role_api import TenantRoleRestAPI
appbuilder = app.appbuilder
# Remove the default RoleRestAPI and register your override
appbuilder.add_view_no_menu(TenantRoleRestAPI)
```
Make sure all imports and registration happen inside FLASK_APP_MUTATOR, not at
the top level, to avoid Flask context errors. This pattern only overrides the
roles listing endpoint and leaves other APIs untouched. You can expand the
filtering logic for more complex multi-tenant scenarios as needed.
This approach is safe, modular, and upgrade-friendly as long as you keep your
override logic in sync with upstream changes to RoleRestAPI.
[Reference: RoleRestAPI and
registration](https://github.com/apache/superset/blob/829e4d92d91ceae4b43b1ed3b063ffe45377799c/superset/security/api.py)
| [App init
pattern](https://github.com/apache/superset/blob/829e4d92d91ceae4b43b1ed3b063ffe45377799c/superset/initialization/__init__.py)
<!-- 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/6286c92d-b1ba-44df-bd3c-fad1d984eb2b?feedback_type=great_response)
|
[Irrelevant](https://app.dosu.dev/response-feedback/6286c92d-b1ba-44df-bd3c-fad1d984eb2b?feedback_type=irrelevant_answer)
|
[Incorrect](https://app.dosu.dev/response-feedback/6286c92d-b1ba-44df-bd3c-fad1d984eb2b?feedback_type=incorrect_sources)
|
[Verbose](https://app.dosu.dev/response-feedback/6286c92d-b1ba-44df-bd3c-fad1d984eb2b?feedback_type=too_verbose)
|
[Hallucination](https://app.dosu.dev/response-feedback/6286c92d-b1ba-44df-bd3c-fad1d984eb2b?feedback_type=hallucination)
| [Report
🐛](https://app.dosu.dev/response-feedback/6286c92d-b1ba-44df-bd3c-fad1d984eb2b?feedback_type=bug_report)
|
[Other](https://app.dosu.dev/response-feedback/6286c92d-b1ba-44df-bd3c-fad1d984eb2b?feedback_type=other)</sup> [](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/33877)
GitHub link:
https://github.com/apache/superset/discussions/33877#discussioncomment-13679617
----
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]