Skip to content

Remove useless jwt role_ids #103

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions backend/app/common/jwt.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ def get_token(request: Request) -> str:


@sync_to_async
def jwt_decode(token: str) -> tuple[int, list[int]]:
def jwt_decode(token: str) -> int:
"""
Decode token

Expand All @@ -135,12 +135,11 @@ def jwt_decode(token: str) -> tuple[int, list[int]]:
try:
payload = jwt.decode(token, settings.TOKEN_SECRET_KEY, algorithms=[settings.TOKEN_ALGORITHM])
user_id = int(payload.get('sub'))
role_ids = list(payload.get('role_ids'))
if not user_id or not role_ids:
if not user_id:
raise TokenError
except (jwt.JWTError, ValidationError, Exception):
raise TokenError
return user_id, role_ids
return user_id


async def jwt_authentication(token: str) -> dict[str, int]:
Expand All @@ -150,7 +149,7 @@ async def jwt_authentication(token: str) -> dict[str, int]:
:param token:
:return:
"""
user_id, _ = await jwt_decode(token)
user_id = await jwt_decode(token)
key = f'{settings.TOKEN_REDIS_PREFIX}:{user_id}:{token}'
token_verify = await redis_client.get(key)
if not token_verify:
Expand Down
7 changes: 0 additions & 7 deletions backend/app/crud/crud_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,13 +118,6 @@ async def set_multi_login(self, db: AsyncSession, user_id: int) -> int:
)
return user.rowcount

async def get_role_ids(self, db: AsyncSession, user_id: int) -> list[int]:
user = await db.execute(
select(self.model).where(self.model.id == user_id).options(selectinload(self.model.roles))
)
roles_id = [role.id for role in user.scalars().first().roles]
return roles_id

async def get_with_relation(self, db: AsyncSession, *, user_id: int = None, username: str = None) -> User | None:
where = []
if user_id:
Expand Down
15 changes: 5 additions & 10 deletions backend/app/services/auth_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,10 @@ async def swagger_login(self, *, form_data: OAuth2PasswordRequestForm):
raise errors.AuthorizationError(msg='用户已锁定, 登陆失败')
# 更新登陆时间
await UserDao.update_login_time(db, form_data.username, self.login_time)
# 查询用户角色
user_role_ids = await UserDao.get_role_ids(db, current_user.id)
# 获取最新用户信息
user = await UserDao.get(db, current_user.id)
# 创建token
access_token, _ = await jwt.create_access_token(
str(user.id), role_ids=user_role_ids, multi_login=user.is_multi_login
)
access_token, _ = await jwt.create_access_token(str(user.id), multi_login=user.is_multi_login)
return access_token, user

async def login(self, *, request: Request, obj: Auth, background_tasks: BackgroundTasks):
Expand All @@ -55,13 +51,12 @@ async def login(self, *, request: Request, obj: Auth, background_tasks: Backgrou
elif not current_user.is_active:
raise errors.AuthorizationError(msg='用户已锁定, 登陆失败')
await UserDao.update_login_time(db, obj.username, self.login_time)
user_role_ids = await UserDao.get_role_ids(db, current_user.id)
user = await UserDao.get(db, current_user.id)
access_token, access_token_expire_time = await jwt.create_access_token(
str(user.id), role_ids=user_role_ids, multi_login=user.is_multi_login
str(user.id), multi_login=user.is_multi_login
)
refresh_token, refresh_token_expire_time = await jwt.create_refresh_token(
str(user.id), access_token_expire_time, role_ids=user_role_ids, multi_login=user.is_multi_login
str(user.id), access_token_expire_time, multi_login=user.is_multi_login
)
except errors.NotFoundError as e:
raise errors.NotFoundError(msg=e.msg)
Expand Down Expand Up @@ -92,15 +87,15 @@ async def login(self, *, request: Request, obj: Auth, background_tasks: Backgrou

@staticmethod
async def new_token(*, refresh_token: str) -> tuple[str, datetime]:
user_id, role_ids = await jwt.jwt_decode(refresh_token)
user_id = await jwt.jwt_decode(refresh_token)
async with async_db_session() as db:
current_user = await UserDao.get(db, user_id)
if not current_user:
raise errors.NotFoundError(msg='用户不存在')
elif not current_user.is_active:
raise errors.AuthorizationError(msg='用户已锁定, 获取失败')
access_new_token, access_new_token_expire_time = await jwt.create_new_token(
str(current_user.id), refresh_token, role_ids=role_ids, multi_login=current_user.is_multi_login
str(current_user.id), refresh_token, multi_login=current_user.is_multi_login
)
return access_new_token, access_new_token_expire_time

Expand Down
2 changes: 1 addition & 1 deletion backend/app/services/user_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ async def update_multi_login(*, request: Request, pk: int) -> int:
else:
count = await UserDao.set_multi_login(db, pk)
token = await get_token(request)
user_id, role_ids = await jwt_decode(token)
user_id = await jwt_decode(token)
latest_multi_login = await UserDao.get_multi_login(db, pk)
# TODO: 删除用户 refresh token, 此操作需要传参,暂时不考虑实现
# 当前用户修改自身时(普通/超级),除当前token外,其他token失效
Expand Down