You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

超级用户封禁用户后被封用户仍可发帖,views.py是否遗漏逻辑?

问题分析与修复方案

1. HTML模板的关键错误

你当前的Ban按钮传递的是post.id而非帖子作者的user.id:

<button type="submit" class="btn btn-warning" value={{post.id}} name="user_id">Ban User</button>

这会导致后端拿到的user_id是帖子ID,而非要封禁的用户ID。虽然控制台提示"移除成功",但实际操作的可能是错误的用户(甚至不存在的用户——User.objects.filter(id=post_id).first()可能返回None,但无判断的情况下执行group.user_set.remove(None)不会报错,所以控制台打印成功但实际无效果)。

修复:把按钮的value改为帖子作者的ID:

<button type="submit" class="btn btn-warning" value={{post.auther.id}} name="user_id">Ban User</button>

2. 封禁逻辑的缺失

仅移除用户分组不足以阻止用户创建帖子,因为:

  • 如果用户本身(不在分组时)仍拥有创建帖子的权限,移除分组不会剥夺该权限
  • 你没有限制被封禁用户的登录或操作权限

可选修复方案:

方案一:禁用用户账号(最直接)

将被封禁用户的is_active设为False,这样用户无法登录:

elif user_id:
    user = User.objects.filter(id=user_id).first()
    if user and request.user.is_staff and user != request.user:  # 防止管理员误封自己
        user.is_active = False
        user.save()
        # 可选保留移除分组操作
        try:
            group = Group.objects.get(name="default")
            group.user_set.remove(user)
        except Group.DoesNotExist:
            pass
        try:
            group = Group.objects.get(name="mode")
            group.user_set.remove(user)
        except Group.DoesNotExist:
            pass

方案二:权限校验拦截(保留账号但限制操作)

如果需要保留用户账号但禁止创建帖子,需在创建帖子的视图中添加权限校验:

@login_required(login_url='login')
def create_post(request):
    # 检查用户是否在允许的分组中
    allowed_groups = ["default", "mode"]
    user_in_allowed = request.user.groups.filter(name__in=allowed_groups).exists()
    if not user_in_allowed:
        return HttpResponse("你已被封禁,无法创建帖子")
    # 其余创建帖子的逻辑...

3. 代码优化建议

  • 捕获异常时不要用except:,应该捕获具体异常(比如Group.DoesNotExist),避免隐藏其他错误
  • 增加对user是否存在的判断,避免对None执行操作
  • 禁止管理员封禁自己,添加user != request.user的判断

内容的提问来源于stack exchange,提问作者Aneeb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:05:09