diff --git a/backend/open_webui/models/users.py b/backend/open_webui/models/users.py index 1eff4932d5..abbbe122ea 100644 --- a/backend/open_webui/models/users.py +++ b/backend/open_webui/models/users.py @@ -27,7 +27,6 @@ from sqlalchemy import ( select, update, ) -from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.ext.asyncio import AsyncSession #################### @@ -360,16 +359,10 @@ class UsersTable: sub: str, db: AsyncSession | None = None, ) -> UserModel | None: - """Look up a user by OAuth provider + subject claim (dialect-aware JSON filter).""" + """Look up a user by OAuth provider + subject claim.""" async with get_async_db_context(db) as session: - dialect = session.bind.dialect.name - query = select(User) - if dialect == 'sqlite': - oauth_match = User.oauth.contains({provider: {'sub': sub}}) - query = query.where(oauth_match) - elif dialect == 'postgresql': - oauth_match = User.oauth[provider].cast(JSONB)['sub'].astext == sub - query = query.where(oauth_match) + # Subscript, never contains(): on a JSON column contains() degrades to a substring LIKE. + query = select(User).where(User.oauth[provider]['sub'].as_string() == sub) row = (await session.execute(query)).scalars().first() return UserModel.model_validate(row) if row else None @@ -379,16 +372,10 @@ class UsersTable: external_id: str, db: AsyncSession | None = None, ) -> UserModel | None: - """Look up a user by SCIM provider + external ID (dialect-aware JSON filter).""" + """Look up a user by SCIM provider + external ID.""" async with get_async_db_context(db) as session: - dialect = session.bind.dialect.name - query = select(User) - if dialect == 'sqlite': - scim_match = User.scim.contains({provider: {'external_id': external_id}}) - query = query.where(scim_match) - elif dialect == 'postgresql': - scim_match = User.scim[provider].cast(JSONB)['external_id'].astext == external_id - query = query.where(scim_match) + # Subscript, never contains(): on a JSON column contains() degrades to a substring LIKE. + query = select(User).where(User.scim[provider]['external_id'].as_string() == external_id) row = (await session.execute(query)).scalars().first() return UserModel.model_validate(row) if row else None