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

Django用户页面权限异常:越权访问时自动切换账号问题排查

问题解决:仅允许用户查看自身个人资料

问题根源

你的代码核心问题是类视图的Mixin顺序错误,导致UserPassesTestMixin的校验逻辑完全没被执行。Django类视图的方法解析顺序(MRO)遵循从左到右的规则,当DetailView放在UserPassesTestMixin前面时,会优先执行DetailView的dispatch方法,直接跳过校验逻辑,自然无法拦截非法访问。

另外,对比用户对象本身理论上可行,但直接对比ID能避免自定义用户模型可能存在的__eq__方法异常问题。

修改后的View代码

class ProfileView(LoginRequiredMixin, UserPassesTestMixin, DetailView):
    model = get_user_model()
    template_name = 'profile.html'
    context_object_name = 'user'
    
    def test_func(self):
        user = self.get_object()
        # 直接对比ID,更稳定可靠
        return user.id == self.request.user.id

关键说明

  • Mixin顺序调整:必须将UserPassesTestMixin放在DetailView之前,确保校验逻辑在获取对象前执行,拦截非法请求。
  • 校验逻辑优化:对比用户ID而非对象实例,避免自定义用户模型的__eq__方法可能引发的判断错误。

修改后,当你以ID为1的用户登录后,尝试访问ID为2的用户资料时,系统会直接拒绝访问,不会返回其他用户的信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:17:12