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
相关产品推荐
相关产品推荐

