1. 新增:微信小程序端新增微信手机号登录功能(必须为企业认证小程序) 2. 新增:加入动态更新常见问题 3. 新增:新增小程序分享功能 4. 新增:小程序新增第一次登录需要修改密码 5. 新增:新增接口权限控制 6. 新增:用户新增is_staff用来判断是否为工作人员 7. 新增:软删除新增is_delete字段来判断,delete_datetime当前主要来记录时间 8. 更新:部分接口删除功能已更新,需要试用软删除的才会试用软删除 9. 更新:更新系统配置缓存功能 10. 更新:接口认证依赖项更新 11. 更新:获取系统基础配置信息与用户协议与隐私协议更新 12. 优化:优化接口与数据库操作
94 lines
3.0 KiB
Python
94 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# @version : 1.0
|
|
# @Creaet Time : 2021/10/24 16:44
|
|
# @File : current.py
|
|
# @IDE : PyCharm
|
|
# @desc : 获取认证后的信息工具
|
|
|
|
from typing import List, Optional
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from sqlalchemy.orm import joinedload
|
|
from apps.vadmin.auth.crud import UserDal
|
|
from apps.vadmin.auth.models import VadminUser
|
|
from core.exception import CustomException
|
|
from utils import status
|
|
from .validation import AuthValidation
|
|
from fastapi import Request, Depends
|
|
from application import settings
|
|
from core.database import db_getter
|
|
from .validation.auth import Auth
|
|
|
|
|
|
def get_user_permissions(user: VadminUser) -> set:
|
|
"""
|
|
获取员工用户所有权限列表
|
|
"""
|
|
if any([role.is_admin for role in user.roles]):
|
|
return {'*.*.*'}
|
|
permissions = set()
|
|
for role_obj in user.roles:
|
|
for menu in role_obj.menus:
|
|
if menu.perms and not menu.disabled:
|
|
permissions.add(menu.perms)
|
|
return permissions
|
|
|
|
|
|
class AllUserAuth(AuthValidation):
|
|
|
|
"""
|
|
支持所有用户认证
|
|
获取用户基本信息
|
|
"""
|
|
|
|
async def __call__(
|
|
self,
|
|
request: Request,
|
|
token: str = Depends(settings.oauth2_scheme),
|
|
db: AsyncSession = Depends(db_getter)
|
|
):
|
|
"""
|
|
每次调用依赖此类的接口会执行该方法
|
|
"""
|
|
telephone = self.validate_token(token, db)
|
|
if isinstance(telephone, Auth):
|
|
return telephone
|
|
user = await UserDal(db).get_data(telephone=telephone, v_return_none=True)
|
|
return await self.validate_user(request, user, db)
|
|
|
|
|
|
class FullAdminAuth(AuthValidation):
|
|
|
|
"""
|
|
只支持员工用户认证
|
|
获取员工用户完整信息
|
|
如果有权限,那么会验证该用户是否包括权限列表中的其中一个权限
|
|
"""
|
|
|
|
def __init__(self, permissions: Optional[List[str]] = None):
|
|
if permissions:
|
|
self.permissions = set(permissions)
|
|
else:
|
|
self.permissions = None
|
|
|
|
async def __call__(
|
|
self,
|
|
request: Request,
|
|
token: str = Depends(settings.oauth2_scheme),
|
|
db: AsyncSession = Depends(db_getter)
|
|
) -> Auth:
|
|
"""
|
|
每次调用依赖此类的接口会执行该方法
|
|
"""
|
|
telephone = self.validate_token(token, db)
|
|
if isinstance(telephone, Auth):
|
|
return telephone
|
|
options = [joinedload(VadminUser.roles), joinedload("roles.menus")]
|
|
user = await UserDal(db).get_data(telephone=telephone, v_return_none=True, v_options=options, is_staff=True)
|
|
result = await self.validate_user(request, user, db)
|
|
permissions = get_user_permissions(user)
|
|
if permissions != {'*.*.*'} and self.permissions:
|
|
if not (self.permissions & permissions):
|
|
raise CustomException(msg="无权限操作", code=status.HTTP_403_FORBIDDEN)
|
|
return result
|
|
|