From cc046695e658e5a870ba0919892cb12eb80cad21 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Tue, 6 Jan 2026 17:23:46 +0100 Subject: [PATCH] feat: add interface user permission (#20424) * feat: add interface user permission Adds admin configurable user / group permissions for the interface settings section * rename --- backend/open_webui/config.py | 8 ++++++ backend/open_webui/routers/users.py | 8 ++++++ .../admin/Users/Groups/EditGroupModal.svelte | 3 ++ .../admin/Users/Groups/Permissions.svelte | 28 ++++++++++++++++++- src/lib/components/chat/SettingsModal.svelte | 4 +++ 5 files changed, 50 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index b56ad0552..680ecbb86 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -1471,6 +1471,11 @@ USER_PERMISSIONS_FEATURES_API_KEYS = ( ) +USER_PERMISSIONS_SETTINGS_INTERFACE = ( + os.environ.get("USER_PERMISSIONS_SETTINGS_INTERFACE", "True").lower() == "true" +) + + DEFAULT_USER_PERMISSIONS = { "workspace": { "models": USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS, @@ -1529,6 +1534,9 @@ DEFAULT_USER_PERMISSIONS = { "image_generation": USER_PERMISSIONS_FEATURES_IMAGE_GENERATION, "code_interpreter": USER_PERMISSIONS_FEATURES_CODE_INTERPRETER, }, + "settings": { + "interface": USER_PERMISSIONS_SETTINGS_INTERFACE, + }, } USER_PERMISSIONS = PersistentConfig( diff --git a/backend/open_webui/routers/users.py b/backend/open_webui/routers/users.py index 4257995f6..f1758f26a 100644 --- a/backend/open_webui/routers/users.py +++ b/backend/open_webui/routers/users.py @@ -227,11 +227,16 @@ class FeaturesPermissions(BaseModel): code_interpreter: bool = True +class SettingsPermissions(BaseModel): + interface: bool = True + + class UserPermissions(BaseModel): workspace: WorkspacePermissions sharing: SharingPermissions chat: ChatPermissions features: FeaturesPermissions + settings: SettingsPermissions @router.get("/default/permissions", response_model=UserPermissions) @@ -249,6 +254,9 @@ async def get_default_user_permissions(request: Request, user=Depends(get_admin_ "features": FeaturesPermissions( **request.app.state.config.USER_PERMISSIONS.get("features", {}) ), + "settings": SettingsPermissions( + **request.app.state.config.USER_PERMISSIONS.get("settings", {}) + ), } diff --git a/src/lib/components/admin/Users/Groups/EditGroupModal.svelte b/src/lib/components/admin/Users/Groups/EditGroupModal.svelte index c0896a17b..daf056d59 100644 --- a/src/lib/components/admin/Users/Groups/EditGroupModal.svelte +++ b/src/lib/components/admin/Users/Groups/EditGroupModal.svelte @@ -91,6 +91,9 @@ web_search: true, image_generation: true, code_interpreter: true + }, + settings: { + interface: true } }; diff --git a/src/lib/components/admin/Users/Groups/Permissions.svelte b/src/lib/components/admin/Users/Groups/Permissions.svelte index 58c3547d3..db73ca3be 100644 --- a/src/lib/components/admin/Users/Groups/Permissions.svelte +++ b/src/lib/components/admin/Users/Groups/Permissions.svelte @@ -61,6 +61,9 @@ web_search: true, image_generation: true, code_interpreter: true + }, + settings: { + interface: true } }; @@ -79,7 +82,8 @@ workspace: { ...defaults.workspace, ...obj.workspace }, sharing: { ...defaults.sharing, ...obj.sharing }, chat: { ...defaults.chat, ...obj.chat }, - features: { ...defaults.features, ...obj.features } + features: { ...defaults.features, ...obj.features }, + settings: { ...defaults.settings, ...obj.settings } }; } @@ -839,4 +843,26 @@ {/if} + +
+ +
+
{$i18n.t('Settings Permissions')}
+ +
+
+
+ {$i18n.t('Interface Settings Access')} +
+ +
+ {#if defaultPermissions?.settings?.interface && !permissions.settings.interface} +
+
+ {$i18n.t('This is a default user permission and will remain enabled.')} +
+
+ {/if} +
+
diff --git a/src/lib/components/chat/SettingsModal.svelte b/src/lib/components/chat/SettingsModal.svelte index 6e7825ba3..9c601ca91 100644 --- a/src/lib/components/chat/SettingsModal.svelte +++ b/src/lib/components/chat/SettingsModal.svelte @@ -487,6 +487,10 @@ ); } + if (tab.id === 'interface') { + return $user?.role === 'admin' || ($user?.permissions?.settings?.interface ?? true); + } + return true; }); };