Django中如何阻止已登录用户访问其他用户的个人资料更新页面
解决方案
你只需要在原视图逻辑中新增一层身份校验,判断当前登录用户是否是要修改的资料所属用户即可,无需修改路由配置。
步骤1:导入依赖模块
from django.shortcuts import get_object_or_404 from django.http import HttpResponseForbidden
步骤2:修改视图函数
修改后的完整视图代码如下:
@login_required def UpdateProfile(request, slug): # 替换原有get方法,避免slug不存在时抛出500错误 user = get_object_or_404(Profile, slug=slug) # 新增身份校验:判断要修改的资料是否属于当前登录用户 if user != request.user.profile: # 校验不通过直接返回403禁止访问,也可根据业务需求调整为跳转逻辑 return HttpResponseForbidden("你无权修改其他用户的资料") if request.method == "POST": form = UpdateProfileForm(request.POST, request.FILES, instance=user) if form.is_valid(): profile_pic = form.cleaned_data['profile_pic'] form.profile_pic = profile_pic form.save() messages.success(request,"Data Updated successfully") return HttpResponseRedirect(reverse('updateaddress', args=(request.user.profile.slug,))) else: messages.error(request, "Please check all fields are valid") return HttpResponseRedirect(request.META.get('HTTP_REFERER')) else: form = UpdateProfileForm(instance=user) context = { 'user':user, 'form':form, } return render(request, "authentication/register/update/profile.html",context)
可选友好交互调整
如果不想返回403页面,可将校验部分替换为跳转逻辑,给用户提示后直接跳转到其本人的资料更新页:
if user != request.user.profile: messages.error(request, "你无权修改其他用户的资料") return HttpResponseRedirect(reverse('updateprofile', args=(request.user.profile.slug,)))
逻辑说明
原代码仅校验了用户是否处于登录状态,没有校验登录用户和待修改资料的归属关系,新增的校验逻辑完全覆盖了越权访问他人资料更新页的场景,即使用户知道其他用户的资料更新URL也无法访问。
内容的提问来源于stack exchange,提问作者Pankaj Kushwaha
相关产品推荐
相关产品推荐

