Skip to content

Commit 9bf8176

Browse files
feat: API permission control
1 parent 2952c87 commit 9bf8176

File tree

8 files changed

+181
-8
lines changed

8 files changed

+181
-8
lines changed

backend/apps/chat/api/chat.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
format_json_data, format_json_list_data, get_chart_config, list_recent_questions
1515
from apps.chat.models.chat_model import CreateChat, ChatRecord, RenameChat, ChatQuestion, AxisObj
1616
from apps.chat.task.llm import LLMService
17+
from apps.system.schemas.permission import SqlbotPermission, require_permissions
1718
from common.core.deps import CurrentAssistant, SessionDep, CurrentUser, Trans
1819
from common.utils.data_format import DataFormat
1920

@@ -86,6 +87,7 @@ async def delete(session: SessionDep, chart_id: int):
8687

8788

8889
@router.post("/start")
90+
@require_permissions(permission=SqlbotPermission(type='ds', keyExpression="create_chat_obj.datasource"))
8991
async def start_chat(session: SessionDep, current_user: CurrentUser, create_chat_obj: CreateChat):
9092
try:
9193
return create_chat(session, current_user, create_chat_obj)
@@ -137,11 +139,13 @@ def _err(_e: Exception):
137139

138140

139141
@router.get("/recent_questions/{datasource_id}")
142+
@require_permissions(permission=SqlbotPermission(type='ds', keyExpression="datasource_id"))
140143
async def recommend_questions(session: SessionDep, current_user: CurrentUser, datasource_id: int):
141144
return list_recent_questions(session=session, current_user=current_user, datasource_id=datasource_id)
142145

143146

144147
@router.post("/question")
148+
@require_permissions(permission=SqlbotPermission(type='chat', keyExpression="request_question.chat_id"))
145149
async def stream_sql(session: SessionDep, current_user: CurrentUser, request_question: ChatQuestion,
146150
current_assistant: CurrentAssistant):
147151
"""Stream SQL analysis results

backend/apps/datasource/api/datasource.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from apps.db.db import get_schema
1414
from apps.db.engine import get_engine_conn
1515
from apps.swagger.i18n import PLACEHOLDER_PREFIX
16+
from apps.system.schemas.permission import SqlbotPermission, require_permissions
1617
from common.core.config import settings
1718
from common.core.deps import SessionDep, CurrentUser, Trans
1819
from common.utils.utils import SQLBotLogUtil
@@ -78,6 +79,7 @@ def inner():
7879

7980

8081
@router.post("/update", response_model=CoreDatasource)
82+
@require_permissions(permission=SqlbotPermission(type='ds', keyExpression="ds.id"))
8183
async def update(session: SessionDep, trans: Trans, user: CurrentUser, ds: CoreDatasource):
8284
def inner():
8385
return update_ds(session, trans, user, ds)
@@ -86,11 +88,13 @@ def inner():
8688

8789

8890
@router.post("/delete/{id}", response_model=CoreDatasource)
91+
@require_permissions(permission=SqlbotPermission(type='ds', keyExpression="id"))
8992
async def delete(session: SessionDep, id: int):
9093
return delete_ds(session, id)
9194

9295

9396
@router.post("/getTables/{id}")
97+
@require_permissions(permission=SqlbotPermission(type='ds', keyExpression="id"))
9498
async def get_tables(session: SessionDep, id: int):
9599
return getTables(session, id)
96100

backend/apps/system/api/aimodel.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from sqlmodel import func, select, update
99

1010
from apps.system.models.system_model import AiModelDetail
11+
from apps.system.schemas.permission import SqlbotPermission, require_permissions
1112
from common.core.deps import SessionDep, Trans
1213
from common.utils.crypto import sqlbot_decrypt
1314
from common.utils.time import get_timestamp
@@ -51,6 +52,7 @@ async def check_default(session: SessionDep, trans: Trans):
5152
raise Exception(trans('i18n_llm.miss_default'))
5253

5354
@router.put("/default/{id}")
55+
@require_permissions(permission=SqlbotPermission(role=['admin']))
5456
async def set_default(session: SessionDep, id: int):
5557
db_model = session.get(AiModelDetail, id)
5658
if not db_model:
@@ -70,6 +72,7 @@ async def set_default(session: SessionDep, id: int):
7072
raise e
7173

7274
@router.get("", response_model=list[AiModelGridItem])
75+
@require_permissions(permission=SqlbotPermission(role=['admin']))
7376
async def query(
7477
session: SessionDep,
7578
keyword: Union[str, None] = Query(default=None, max_length=255)
@@ -113,6 +116,7 @@ async def get_model_by_id(
113116
return AiModelEditor(**data)
114117

115118
@router.post("")
119+
@require_permissions(permission=SqlbotPermission(role=['admin']))
116120
async def add_model(
117121
session: SessionDep,
118122
creator: AiModelCreator
@@ -129,6 +133,7 @@ async def add_model(
129133
session.commit()
130134

131135
@router.put("")
136+
@require_permissions(permission=SqlbotPermission(role=['admin']))
132137
async def update_model(
133138
session: SessionDep,
134139
editor: AiModelEditor
@@ -144,6 +149,7 @@ async def update_model(
144149
session.commit()
145150

146151
@router.delete("/{id}")
152+
@require_permissions(permission=SqlbotPermission(role=['admin']))
147153
async def delete_model(
148154
session: SessionDep,
149155
trans: Trans,

backend/apps/system/api/parameter.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55

66
from apps.system.crud.parameter_manage import get_groups, get_parameter_args, save_parameter_args
7+
from apps.system.schemas.permission import SqlbotPermission, require_permissions
78
from common.core.deps import SessionDep
89

910
router = APIRouter(tags=["system/parameter"], prefix="/system/parameter")
@@ -13,9 +14,11 @@ async def get_login_args(session: SessionDep) -> list[SysArgModel]:
1314
return await get_groups(session, "login")
1415

1516
@router.get("")
17+
@require_permissions(permission=SqlbotPermission(role=['admin']))
1618
async def get_args(session: SessionDep) -> list[SysArgModel]:
1719
return await get_parameter_args(session)
1820

1921
@router.post("", )
22+
@require_permissions(permission=SqlbotPermission(role=['admin']))
2023
async def save_args(session: SessionDep, request: Request):
2124
return await save_parameter_args(session = session, request = request)

backend/apps/system/api/user.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from apps.system.models.system_model import UserWsModel, WorkspaceModel
77
from apps.system.models.user import UserModel
88
from apps.system.schemas.auth import CacheName, CacheNamespace
9+
from apps.system.schemas.permission import SqlbotPermission, require_permissions
910
from apps.system.schemas.system_schema import PwdEditor, UserCreator, UserEditor, UserGrid, UserLanguage, UserStatus, UserWs
1011
from common.core.deps import CurrentUser, SessionDep, Trans
1112
from common.core.pagination import Paginator
@@ -20,11 +21,14 @@
2021
async def user_info(current_user: CurrentUser):
2122
return current_user
2223

24+
2325
@router.get("/defaultPwd")
26+
@require_permissions(permission=SqlbotPermission(role=['admin']))
2427
async def default_pwd() -> str:
2528
return settings.DEFAULT_PWD
2629

2730
@router.get("/pager/{pageNum}/{pageSize}", response_model=PaginatedResponse[UserGrid])
31+
@require_permissions(permission=SqlbotPermission(role=['admin']))
2832
async def pager(
2933
session: SessionDep,
3034
pageNum: int,
@@ -123,6 +127,7 @@ async def ws_change(session: SessionDep, current_user: CurrentUser, trans:Trans,
123127
session.commit()
124128

125129
@router.get("/{id}", response_model=UserEditor)
130+
@require_permissions(permission=SqlbotPermission(role=['admin']))
126131
async def query(session: SessionDep, trans: Trans, id: int) -> UserEditor:
127132
db_user: UserModel = get_db_user(session = session, user_id = id)
128133
u_ws_options = await user_ws_options(session, id, trans)
@@ -131,7 +136,9 @@ async def query(session: SessionDep, trans: Trans, id: int) -> UserEditor:
131136
result.oid_list = [item.id for item in u_ws_options]
132137
return result
133138

139+
134140
@router.post("")
141+
@require_permissions(permission=SqlbotPermission(role=['admin']))
135142
async def create(session: SessionDep, creator: UserCreator, trans: Trans):
136143
if check_account_exists(session=session, account=creator.account):
137144
raise Exception(trans('i18n_exist', msg = f"{trans('i18n_user.account')} [{creator.account}]"))
@@ -158,8 +165,10 @@ async def create(session: SessionDep, creator: UserCreator, trans: Trans):
158165
user_model.oid = creator.oid_list[0]
159166
session.add(user_model)
160167
session.commit()
168+
161169

162170
@router.put("")
171+
@require_permissions(permission=SqlbotPermission(role=['admin']))
163172
@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="editor.id")
164173
async def update(session: SessionDep, editor: UserEditor, trans: Trans):
165174
user_model: UserModel = get_db_user(session = session, user_id = editor.id)
@@ -193,12 +202,14 @@ async def update(session: SessionDep, editor: UserEditor, trans: Trans):
193202
user_model.oid = origin_oid if origin_oid in editor.oid_list else editor.oid_list[0]
194203
session.add(user_model)
195204
session.commit()
196-
205+
197206
@router.delete("/{id}")
207+
@require_permissions(permission=SqlbotPermission(role=['admin']))
198208
async def delete(session: SessionDep, id: int):
199209
await single_delete(session, id)
200210

201-
@router.delete("")
211+
@router.delete("")
212+
@require_permissions(permission=SqlbotPermission(role=['admin']))
202213
async def batch_del(session: SessionDep, id_list: list[int]):
203214
for id in id_list:
204215
await single_delete(session, id)
@@ -213,8 +224,10 @@ async def langChange(session: SessionDep, current_user: CurrentUser, trans: Tran
213224
db_user.language = lang
214225
session.add(db_user)
215226
session.commit()
216-
227+
228+
217229
@router.patch("/pwd/{id}")
230+
@require_permissions(permission=SqlbotPermission(role=['admin']))
218231
@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="id")
219232
async def pwdReset(session: SessionDep, current_user: CurrentUser, trans: Trans, id: int):
220233
if not current_user.isAdmin:
@@ -236,8 +249,10 @@ async def pwdUpdate(session: SessionDep, current_user: CurrentUser, trans: Trans
236249
db_user.password = md5pwd(new_pwd)
237250
session.add(db_user)
238251
session.commit()
252+
239253

240254
@router.patch("/status")
255+
@require_permissions(permission=SqlbotPermission(role=['admin']))
241256
@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="statusDto.id")
242257
async def langChange(session: SessionDep, current_user: CurrentUser, trans: Trans, statusDto: UserStatus):
243258
if not current_user.isAdmin:

backend/apps/system/api/workspace.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from apps.system.crud.workspace import reset_single_user_oid, reset_user_oid
66
from apps.system.models.system_model import UserWsModel, WorkspaceBase, WorkspaceEditor, WorkspaceModel
77
from apps.system.models.user import UserModel
8+
from apps.system.schemas.permission import SqlbotPermission, require_permissions
89
from apps.system.schemas.system_schema import UserWsBase, UserWsDTO, UserWsEditor, UserWsOption, WorkspaceUser
910
from common.core.deps import CurrentUser, SessionDep, Trans
1011
from common.core.pagination import Paginator
@@ -14,6 +15,7 @@
1415
router = APIRouter(tags=["system/workspace"], prefix="/system/workspace")
1516

1617
@router.get("/uws/option/pager/{pageNum}/{pageSize}", response_model=PaginatedResponse[UserWsOption])
18+
@require_permissions(permission=SqlbotPermission(role=['ws_admin']))
1719
async def option_pager(
1820
session: SessionDep,
1921
current_user: CurrentUser,
@@ -48,6 +50,7 @@ async def option_pager(
4850
)
4951

5052
@router.get("/uws/option", response_model=UserWsOption | None)
53+
@require_permissions(permission=SqlbotPermission(role=['ws_admin']))
5154
async def option_user(
5255
session: SessionDep,
5356
current_user: CurrentUser,
@@ -74,7 +77,9 @@ async def option_user(
7477
)
7578
return session.exec(stmt).first()
7679

80+
7781
@router.get("/uws/pager/{pageNum}/{pageSize}", response_model=PaginatedResponse[WorkspaceUser])
82+
@require_permissions(permission=SqlbotPermission(role=['ws_admin']))
7883
async def pager(
7984
session: SessionDep,
8085
current_user: CurrentUser,
@@ -114,7 +119,8 @@ async def pager(
114119
)
115120

116121

117-
@router.post("/uws")
122+
@router.post("/uws")
123+
@require_permissions(permission=SqlbotPermission(role=['ws_admin']))
118124
async def create(session: SessionDep, current_user: CurrentUser, trans: Trans, creator: UserWsDTO):
119125
if not current_user.isAdmin and current_user.weight == 0:
120126
raise Exception(trans('i18n_permission.no_permission', url = '', msg = ''))
@@ -136,7 +142,8 @@ async def create(session: SessionDep, current_user: CurrentUser, trans: Trans, c
136142
session.add_all(db_model_list)
137143
session.commit()
138144

139-
@router.put("/uws")
145+
@router.put("/uws")
146+
@require_permissions(permission=SqlbotPermission(role=['admin']))
140147
async def edit(session: SessionDep, trans: Trans, editor: UserWsEditor):
141148
if not editor.oid or not editor.uid:
142149
raise Exception(trans('i18n_miss_args', key = '[oid, uid]'))
@@ -152,7 +159,8 @@ async def edit(session: SessionDep, trans: Trans, editor: UserWsEditor):
152159
await clean_user_cache(editor.uid)
153160
session.commit()
154161

155-
@router.delete("/uws")
162+
@router.delete("/uws")
163+
@require_permissions(permission=SqlbotPermission(role=['ws_admin']))
156164
async def delete(session: SessionDep, current_user: CurrentUser, trans: Trans, dto: UserWsBase):
157165
if not current_user.isAdmin and current_user.weight == 0:
158166
raise Exception(trans('i18n_permission.no_permission', url = '', msg = ''))
@@ -170,6 +178,7 @@ async def delete(session: SessionDep, current_user: CurrentUser, trans: Trans, d
170178
session.commit()
171179

172180
@router.get("", response_model=list[WorkspaceModel])
181+
@require_permissions(permission=SqlbotPermission(role=['admin']))
173182
async def query(session: SessionDep, trans: Trans):
174183
list_result = session.exec(select(WorkspaceModel)).all()
175184
for ws in list_result:
@@ -179,13 +188,15 @@ async def query(session: SessionDep, trans: Trans):
179188
return list_result
180189

181190
@router.post("")
191+
@require_permissions(permission=SqlbotPermission(role=['admin']))
182192
async def add(session: SessionDep, creator: WorkspaceBase):
183193
db_model = WorkspaceModel.model_validate(creator)
184194
db_model.create_time = get_timestamp()
185195
session.add(db_model)
186196
session.commit()
187197

188198
@router.put("")
199+
@require_permissions(permission=SqlbotPermission(role=['admin']))
189200
async def update(session: SessionDep, editor: WorkspaceEditor):
190201
id = editor.id
191202
db_model = session.get(WorkspaceModel, id)
@@ -195,7 +206,8 @@ async def update(session: SessionDep, editor: WorkspaceEditor):
195206
session.add(db_model)
196207
session.commit()
197208

198-
@router.get("/{id}", response_model=WorkspaceModel)
209+
@router.get("/{id}", response_model=WorkspaceModel)
210+
@require_permissions(permission=SqlbotPermission(role=['admin']))
199211
async def get_one(session: SessionDep, trans: Trans, id: int):
200212
db_model = session.get(WorkspaceModel, id)
201213
if not db_model:
@@ -204,7 +216,8 @@ async def get_one(session: SessionDep, trans: Trans, id: int):
204216
db_model.name = trans(db_model.name)
205217
return db_model
206218

207-
@router.delete("/{id}")
219+
@router.delete("/{id}")
220+
@require_permissions(permission=SqlbotPermission(role=['admin']))
208221
async def single_delete(session: SessionDep, current_user: CurrentUser, id: int):
209222
if not current_user.isAdmin:
210223
raise HTTPException("only admin can delete workspace")

0 commit comments

Comments
 (0)