Update the OAuth2 login password policy (#741)

* Update the OAuth2 login password policy

* Update the crud pwd

* Update the reset pwd service
This commit is contained in:
Wu Clan
2025-07-29 22:51:31 +08:00
committed by GitHub
parent d64f7c2911
commit 83dcdbe59d
5 changed files with 37 additions and 37 deletions

View File

@@ -89,10 +89,8 @@ class CRUDUser(CRUDPlus[User]):
:param obj: 注册用户参数
:return:
"""
salt = bcrypt.gensalt()
obj.password = get_hash_password(obj.password, salt)
dict_obj = obj.model_dump()
dict_obj.update({'is_staff': True, 'salt': salt})
dict_obj.update({'is_staff': True, 'salt': None})
new_user = self.model(**dict_obj)
stmt = select(Role)
@@ -156,10 +154,12 @@ class CRUDUser(CRUDPlus[User]):
:param db: 数据库会话
:param pk: 用户 ID
:param new_pwd: 新密码(已加密)
:param new_pwd: 新密码
:return:
"""
return await self.update_model(db, pk, {'password': new_pwd})
salt = bcrypt.gensalt()
new_pwd = get_hash_password(new_pwd, salt)
return await self.update_model(db, pk, {'password': new_pwd, 'salt': salt})
async def get_list(self, dept: int | None, username: str | None, phone: str | None, status: int | None) -> Select:
"""

View File

@@ -27,8 +27,8 @@ class User(Base):
uuid: Mapped[str] = mapped_column(String(50), init=False, default_factory=uuid4_str, unique=True)
username: Mapped[str] = mapped_column(String(20), unique=True, index=True, comment='用户名')
nickname: Mapped[str] = mapped_column(String(20), comment='昵称')
password: Mapped[str] = mapped_column(String(255), comment='密码')
salt: Mapped[bytes] = mapped_column(VARBINARY(255).with_variant(BYTEA(255), 'postgresql'), comment='加密盐')
password: Mapped[str | None] = mapped_column(String(255), comment='密码')
salt: Mapped[bytes | None] = mapped_column(VARBINARY(255).with_variant(BYTEA(255), 'postgresql'), comment='加密盐')
email: Mapped[str | None] = mapped_column(String(50), default=None, unique=True, index=True, comment='邮箱')
phone: Mapped[str | None] = mapped_column(String(11), default=None, comment='手机号')
avatar: Mapped[str | None] = mapped_column(String(255), default=None, comment='头像')

View File

@@ -18,7 +18,7 @@ from backend.app.admin.schema.user import (
)
from backend.common.enums import UserPermissionType
from backend.common.exception import errors
from backend.common.security.jwt import get_hash_password, get_token, jwt_decode, password_verify, superuser_verify
from backend.common.security.jwt import get_token, jwt_decode, password_verify, superuser_verify
from backend.core.conf import settings
from backend.database.db import async_db_session
from backend.database.redis import redis_client
@@ -249,8 +249,7 @@ class UserService:
raise errors.RequestError(msg='原密码错误')
if obj.new_password != obj.confirm_password:
raise errors.RequestError(msg='密码输入不一致')
new_pwd = get_hash_password(obj.new_password, user.salt)
count = await user_dao.reset_password(db, user.id, new_pwd)
count = await user_dao.reset_password(db, user.id, obj.new_password)
key_prefix = [
f'{settings.TOKEN_REDIS_PREFIX}:{user.id}',
f'{settings.TOKEN_REFRESH_REDIS_PREFIX}:{user.id}',

View File

@@ -1,6 +1,6 @@
[plugin]
summary = 'OAuth 2.0'
version = '0.0.3'
version = '0.0.4'
description = '通过 OAuth 2.0 的方式登录系统'
author = 'wu-clan'

View File

@@ -57,35 +57,36 @@ class OAuth2Service:
sid = user.get('id')
nickname = user.get('name')
sys_user = None
user_social = await user_social_dao.get_by_sid(db, str(sid), str(social.value))
if not user_social:
if email:
sys_user = await user_dao.check_email(db, email)
# 创建系统用户
if not sys_user:
while await user_dao.get_by_username(db, username):
username = f'{username}_{text_captcha(5)}'
new_sys_user = AddOAuth2UserParam(
username=username,
password='123456', # 默认密码,可修改系统用户表进行默认密码检测并配合前端进行修改密码提示
nickname=nickname,
email=email,
avatar=avatar,
)
await user_dao.add_by_oauth2(db, new_sys_user)
await db.flush()
sys_user = await user_dao.get_by_username(db, username)
# 绑定社交用户
new_user_social = CreateUserSocialParam(sid=str(sid), source=social.value, user_id=sys_user.id)
await user_social_dao.create(db, new_user_social)
if not sys_user:
if user_social:
sys_user = await user_dao.get(db, user_social.user_id)
if avatar:
# 更新用户头像
if not sys_user.avatar and avatar is not None:
await user_dao.update_avatar(db, sys_user.id, avatar)
else:
sys_user = None
# 检测系统用户是否已存在
if email:
sys_user = await user_dao.check_email(db, email) # 通过邮箱验证绑定保证邮箱真实性
# 创建系统用户
if not sys_user:
while await user_dao.get_by_username(db, username):
username = f'{username}_{text_captcha(5)}'
new_sys_user = AddOAuth2UserParam(
username=username,
password=None,
nickname=nickname,
email=email,
avatar=avatar,
)
await user_dao.add_by_oauth2(db, new_sys_user)
await db.flush()
sys_user = await user_dao.get_by_username(db, username)
# 绑定社交账号
new_user_social = CreateUserSocialParam(sid=str(sid), source=social.value, user_id=sys_user.id)
await user_social_dao.create(db, new_user_social)
# 创建 token
access_token = await jwt.create_access_token(