Skip to content

Commit e9a893a

Browse files
perf: Token
1 parent 98a6bbb commit e9a893a

File tree

6 files changed

+28
-15
lines changed

6 files changed

+28
-15
lines changed

backend/apps/system/api/login.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import Annotated
22
from fastapi import APIRouter, Depends, HTTPException
33
from fastapi.security import OAuth2PasswordRequestForm
4+
from apps.system.schemas.system_schema import BaseUserDTO
45
from common.core.deps import SessionDep
56
from ..crud.user import authenticate
67
from common.core.security import create_access_token
@@ -14,9 +15,12 @@ def local_login(
1415
session: SessionDep,
1516
form_data: Annotated[OAuth2PasswordRequestForm, Depends()]
1617
) -> Token:
17-
user = authenticate(session=session, account=form_data.username, password=form_data.password)
18+
user: BaseUserDTO = authenticate(session=session, account=form_data.username, password=form_data.password)
1819
if not user:
1920
raise HTTPException(status_code=400, detail="Incorrect account or password")
21+
22+
if not user.oid or user.oid == 0:
23+
raise HTTPException(status_code=400, detail="No associated workspace, Please contact the administrator")
2024
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
2125
user_dict = user.to_dict()
2226
return Token(access_token=create_access_token(

backend/apps/system/api/user.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from typing import Optional
2-
from fastapi import APIRouter, Query
2+
from fastapi import APIRouter, HTTPException, Query
33
from sqlmodel import func, or_, select, delete as sqlmodel_delete
44
from apps.system.crud.user import get_db_user, single_delete, user_ws_options
55
from apps.system.models.system_model import UserWsModel
@@ -99,7 +99,7 @@ async def ws_options(session: SessionDep, current_user: CurrentUser, trans: Tran
9999
async def ws_change(session: SessionDep, current_user: CurrentUser, oid: int):
100100
ws_list: list[UserWs] = await user_ws_options(session, current_user.id)
101101
if not any(x.id == oid for x in ws_list):
102-
raise RuntimeError(f"oid [{oid}] is invalid!")
102+
raise HTTPException(f"oid [{oid}] is invalid!")
103103
user_model: UserModel = get_db_user(session = session, user_id = current_user.id)
104104
user_model.oid = oid
105105
session.add(user_model)
@@ -120,7 +120,7 @@ async def create(session: SessionDep, creator: UserCreator):
120120
user_model = UserModel.model_validate(data)
121121
#user_model.create_time = get_timestamp()
122122
user_model.language = "zh-CN"
123-
session.add(user_model)
123+
user_model.oid = 0
124124
if creator.oid_list:
125125
# need to validate oid_list
126126
db_model_list = [
@@ -132,20 +132,22 @@ async def create(session: SessionDep, creator: UserCreator):
132132
for oid in creator.oid_list
133133
]
134134
session.add_all(db_model_list)
135+
user_model.oid = creator.oid_list[0]
136+
session.add(user_model)
135137
session.commit()
136138

137139
@router.put("")
138140
@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="editor.id")
139141
async def update(session: SessionDep, editor: UserEditor):
140142
user_model: UserModel = get_db_user(session = session, user_id = editor.id)
141-
143+
origin_oid: int = user_model.oid
142144
del_stmt = sqlmodel_delete(UserWsModel).where(UserWsModel.uid == editor.id)
143145
session.exec(del_stmt)
144146

145147
data = editor.model_dump(exclude_unset=True)
146148
user_model.sqlmodel_update(data)
147-
session.add(user_model)
148149

150+
user_model.oid = 0
149151
if editor.oid_list:
150152
# need to validate oid_list
151153
db_model_list = [
@@ -157,7 +159,8 @@ async def update(session: SessionDep, editor: UserEditor):
157159
for oid in editor.oid_list
158160
]
159161
session.add_all(db_model_list)
160-
162+
user_model.oid = origin_oid if origin_oid in editor.oid_list else editor.oid_list[0]
163+
session.add(user_model)
161164
session.commit()
162165

163166
@router.delete("/{id}")
@@ -184,7 +187,7 @@ async def langChange(session: SessionDep, current_user: CurrentUser, language: U
184187
@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="id")
185188
async def pwdReset(session: SessionDep, current_user: CurrentUser, id: int):
186189
if not current_user.isAdmin:
187-
raise RuntimeError('only for admin')
190+
raise HTTPException('only for admin')
188191
db_user: UserModel = get_db_user(session=session, user_id=id)
189192
db_user.password = default_md5_pwd()
190193
session.add(db_user)
@@ -195,7 +198,7 @@ async def pwdReset(session: SessionDep, current_user: CurrentUser, id: int):
195198
async def pwdUpdate(session: SessionDep, current_user: CurrentUser, editor: PwdEditor):
196199
db_user: UserModel = get_db_user(session=session, user_id=current_user.id)
197200
if not verify_md5pwd(editor.pwd, db_user.password):
198-
raise RuntimeError("pwd error")
201+
raise HTTPException("pwd error")
199202
db_user.password = md5pwd(editor.new_pwd)
200203
session.add(db_user)
201204
session.commit()

backend/apps/system/middleware/auth.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
from typing import Optional
3-
from fastapi import Request
3+
from fastapi import HTTPException, Request
44
from fastapi.responses import JSONResponse
55
import jwt
66
from sqlmodel import Session
@@ -35,15 +35,15 @@ async def dispatch(self, request, call_next):
3535
request.state.current_user = validator[1]
3636
request.state.assistant = validator[2]
3737
return await call_next(request)
38-
return JSONResponse({"error": f"Unauthorized:[{validator[1]}]"}, status_code=401)
38+
return JSONResponse({"msg": f"Unauthorized:[{validator[1]}]"}, status_code=401)
3939
#validate pass
4040
tokenkey = settings.TOKEN_KEY
4141
token = request.headers.get(tokenkey)
4242
validate_pass, data = await self.validateToken(token)
4343
if validate_pass:
4444
request.state.current_user = data
4545
return await call_next(request)
46-
return JSONResponse({"error": f"Unauthorized:[{data}]"}, status_code=401)
46+
return JSONResponse({"msg": f"Unauthorized:[{data}]"}, status_code=401)
4747

4848
def is_options(self, request: Request):
4949
return request.method == "OPTIONS"
@@ -62,6 +62,12 @@ async def validateToken(self, token: Optional[str]):
6262
with Session(engine) as session:
6363
session_user = await get_user_info(session = session, user_id = token_data.id)
6464
session_user = UserInfoDTO.model_validate(session_user)
65+
session_user = UserInfoDTO.model_validate(session_user)
66+
if token_data.oid != session_user.oid:
67+
raise HTTPException(
68+
status_code=401,
69+
detail="Default space has been changed, please login again!"
70+
)
6571
return True, session_user
6672
except Exception as e:
6773
return False, e

backend/apps/system/models/user.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
class BaseUserPO(SQLModel):
1212
account: str = Field(max_length=255, unique=True)
13-
oid: int = Field(nullable=False, sa_type=BigInteger())
13+
oid: int = Field(nullable=False, sa_type=BigInteger(), default=0)
1414
name: str = Field(max_length=255, unique=True)
1515
password: str = Field(default_factory=default_md5_pwd, max_length=255)
1616
email: str = Field(max_length=255)

frontend/src/router/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ const router = createRouter({
121121
{
122122
path: '/system',
123123
component: LayoutDsl,
124-
redirect: '/system/model',
124+
redirect: '/system/user',
125125
children: [
126126
{
127127
path: 'user',

frontend/src/views/system/user/User.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ const state = reactive<any>({
352352
id: '',
353353
name: '',
354354
account: '',
355-
oid: 1,
355+
oid: 0,
356356
email: '',
357357
status: '',
358358
phoneNumber: '',

0 commit comments

Comments
 (0)