forked from erp-dev/erp
feat: added pgadmin container
This commit is contained in:
131
diagnose_permissions.py
Normal file
131
diagnose_permissions.py
Normal file
@@ -0,0 +1,131 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
PlateOrder PATCH 权限诊断脚本
|
||||
用于检查用户是否有正确的权限
|
||||
"""
|
||||
import os
|
||||
import django
|
||||
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'flower.settings')
|
||||
django.setup()
|
||||
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.models import Permission
|
||||
from printing.models import PlateOrder
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
def diagnose_user_permissions(username):
|
||||
"""诊断用户权限"""
|
||||
print(f"\n{'='*60}")
|
||||
print(f"诊断用户: {username}")
|
||||
print(f"{'='*60}\n")
|
||||
|
||||
try:
|
||||
user = User.objects.get(username=username)
|
||||
except User.DoesNotExist:
|
||||
print(f"❌ 用户 '{username}' 不存在!")
|
||||
return
|
||||
|
||||
print(f"✅ 用户存在: {user.username} ({user.email})")
|
||||
print(f" - is_active: {user.is_active}")
|
||||
print(f" - is_staff: {user.is_staff}")
|
||||
print(f" - is_superuser: {user.is_superuser}")
|
||||
|
||||
if user.is_superuser:
|
||||
print("\n✅ 用户是超级管理员,拥有所有权限!")
|
||||
return
|
||||
|
||||
# 检查 PlateOrder 相关权限
|
||||
required_perms = [
|
||||
'printing.view_plateorder',
|
||||
'printing.add_plateorder',
|
||||
'printing.change_plateorder', # ⚠️ PATCH 需要这个
|
||||
'printing.delete_plateorder',
|
||||
]
|
||||
|
||||
print("\n📋 PlateOrder 权限检查:")
|
||||
print("-" * 60)
|
||||
|
||||
for perm in required_perms:
|
||||
has_perm = user.has_perm(perm)
|
||||
icon = "✅" if has_perm else "❌"
|
||||
action = perm.split('.')[1].replace('_', ' ').title()
|
||||
print(f"{icon} {action:30} ({perm})")
|
||||
|
||||
if perm == 'printing.change_plateorder' and not has_perm:
|
||||
print(" ⚠️ 缺少此权限会导致 PATCH/PUT 请求返回 401/403!")
|
||||
|
||||
# 检查用户所属组
|
||||
groups = user.groups.all()
|
||||
if groups.exists():
|
||||
print(f"\n👥 用户所属组: {', '.join(g.name for g in groups)}")
|
||||
for group in groups:
|
||||
print(f"\n 组 '{group.name}' 的权限:")
|
||||
group_perms = group.permissions.filter(
|
||||
content_type__app_label='printing',
|
||||
content_type__model='plateorder'
|
||||
)
|
||||
for perm in group_perms:
|
||||
print(f" - {perm.codename}")
|
||||
else:
|
||||
print("\n👥 用户不属于任何组")
|
||||
|
||||
# 检查直接授予的权限
|
||||
direct_perms = user.user_permissions.filter(
|
||||
content_type__app_label='printing',
|
||||
content_type__model='plateorder'
|
||||
)
|
||||
if direct_perms.exists():
|
||||
print(f"\n🔑 直接授予的权限:")
|
||||
for perm in direct_perms:
|
||||
print(f" - {perm.codename}")
|
||||
else:
|
||||
print("\n🔑 没有直接授予的权限")
|
||||
|
||||
print("\n" + "="*60)
|
||||
|
||||
# 提供修复建议
|
||||
if not user.has_perm('printing.change_plateorder'):
|
||||
print("\n💡 修复方法:")
|
||||
print("-" * 60)
|
||||
print("在 Django shell 中运行以下代码:")
|
||||
print(f"""
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.models import Permission
|
||||
|
||||
User = get_user_model()
|
||||
user = User.objects.get(username='{username}')
|
||||
change_perm = Permission.objects.get(codename='change_plateorder')
|
||||
user.user_permissions.add(change_perm)
|
||||
print("✅ 权限已添加!")
|
||||
""")
|
||||
|
||||
|
||||
def list_all_users():
|
||||
"""列出所有用户"""
|
||||
users = User.objects.all()
|
||||
if not users.exists():
|
||||
print("❌ 系统中没有用户!")
|
||||
return
|
||||
|
||||
print(f"\n{'='*60}")
|
||||
print("系统中的所有用户:")
|
||||
print(f"{'='*60}\n")
|
||||
|
||||
for user in users:
|
||||
has_change = user.has_perm('printing.change_plateorder')
|
||||
icon = "✅" if has_change else "❌"
|
||||
print(f"{icon} {user.username:20} (is_active: {user.is_active}, has_change_plateorder: {has_change})")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
|
||||
if len(sys.argv) > 1:
|
||||
username = sys.argv[1]
|
||||
diagnose_user_permissions(username)
|
||||
else:
|
||||
list_all_users()
|
||||
print("\n💡 使用方法: python diagnose_permissions.py <username>")
|
||||
|
||||
Reference in New Issue
Block a user