feat: JWT多租户数据权限隔离 & 主管系统管理权限 & 含税单价补齐
## 多租户公司数据隔离 - 新增 get_current_company_filter() 工具函数 (decorators.py) SUPER_ADMIN: 可传company_name参数过滤或传ALL看全量 其他角色: 强制隔离到JWT中的company_name - 重构 base_service.py / buy_service.py: 用集中式函数替换内联公司过滤 - SysRolePermission 表新增 company_name 字段,支持同角色不同公司权限 - get_user_permissions() 新增 company_name 参数,查公司定制+全局模板权限 - permission.py API 新增 @permission_required 拦截 + 公司过滤 - 19个API/service文件传递 company_name 到权限查询 ## 主管系统管理权限 - delete_user() 允许SUPERVISOR删除同公司用户 (原仅SUPER_ADMIN) - get_all_users() 新增 company_name 参数过滤 - 用户列表/权限分配 API 应用 get_current_company_filter() - 前端 UserCreate.vue: 超管可见公司下拉框,主管隐藏部门字段 ## 前端多租户适配 - material/list.vue / buy.vue: 公司下拉框仅超管可见,默认ALL - UserCreate.vue: 新增搜索栏公司筛选,部门字段按角色显隐 - auth.ts: getUserList() 支持 params 参数 ## Bug修复: 含税单价字段补齐 - buy.vue: 表格列/高级筛选/排序/权限映射新增 post_tax_unit_price - buy_service.py: allowed_fields/sort_field_map 新增 post_tax_unit_price
This commit is contained in:
@ -31,16 +31,17 @@ auth_bp = Blueprint('auth', __name__)
|
||||
def get_current_user_permissions():
|
||||
"""
|
||||
返回当前用户拥有的所有权限码列表(包括菜单和元素)
|
||||
此函数根据角色查询数据库得到权限。
|
||||
此函数根据角色+公司查询数据库得到权限。
|
||||
"""
|
||||
claims = get_jwt()
|
||||
user_role = claims.get('role')
|
||||
user_company = claims.get('company_name', '')
|
||||
if not user_role:
|
||||
return []
|
||||
# 超级管理员返回所有字段权限 (忽略大小写)
|
||||
# 超级管理员返回所有字段权限
|
||||
if user_role.upper() == 'SUPER_ADMIN':
|
||||
return ['system_user:*']
|
||||
perm_dict = AuthService.get_user_permissions(user_role)
|
||||
perm_dict = AuthService.get_user_permissions(user_role, company_name=user_company)
|
||||
# 合并菜单和元素权限
|
||||
perms = perm_dict.get('menus', []) + perm_dict.get('elements', [])
|
||||
return perms
|
||||
@ -269,7 +270,9 @@ def update_user(user_id):
|
||||
@permission_required('system_user')
|
||||
def get_users():
|
||||
try:
|
||||
users = AuthService.get_all_users()
|
||||
from app.utils.decorators import get_current_company_filter
|
||||
company_filter = get_current_company_filter()
|
||||
users = AuthService.get_all_users(company_name=company_filter)
|
||||
user_permissions = get_current_user_permissions()
|
||||
filtered_users = [filter_item_by_permissions(user, user_permissions) for user in users]
|
||||
return jsonify({'msg': '获取成功', 'data': filtered_users}), 200
|
||||
@ -293,8 +296,9 @@ def delete_user(user_id):
|
||||
try:
|
||||
claims = get_jwt()
|
||||
operator_role = claims.get('role')
|
||||
operator_company = claims.get('company_name', '')
|
||||
|
||||
username = AuthService.delete_user(user_id, operator_role)
|
||||
username = AuthService.delete_user(user_id, operator_role, operator_company)
|
||||
return jsonify({'msg': '删除成功', 'username': username}), 200
|
||||
except Exception as e:
|
||||
current_app.logger.error(f"Delete User Failed: {str(e)}")
|
||||
@ -311,7 +315,8 @@ def get_my_permissions():
|
||||
try:
|
||||
claims = get_jwt()
|
||||
role = claims.get('role')
|
||||
permissions = AuthService.get_user_permissions(role)
|
||||
company_name = claims.get('company_name', '')
|
||||
permissions = AuthService.get_user_permissions(role, company_name=company_name)
|
||||
return jsonify({'msg': '获取成功', 'data': permissions}), 200
|
||||
except Exception as e:
|
||||
current_app.logger.error(f"Get Permissions Failed: {str(e)}")
|
||||
|
||||
Reference in New Issue
Block a user