如何限制已授权用户访问他人Profile,防止越权查看?
修复越权访问Profile的问题
核心问题是你的Profile模型和Django的User模型没有建立关联,导致无法验证当前登录用户是否有权访问请求的Profile。按照以下步骤修复:
1. 给Profile模型添加User关联
在你的models.py中修改Profile类,添加一对一外键关联到User:
from django.contrib.auth.models import User class Profile(models.Model): profile_id = models.CharField(max_length=255, unique=True) # 保留原有的pers_id字段 user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') first_name = models.CharField(max_length=255) last_name = models.CharField(max_length=255) photo_url = models.URLField() # 其他字段...
2. 更新vk_callback视图,关联用户到Profile
在创建或更新Profile时,把当前登录用户关联进去:
def vk_callback(request): try: vk_user = UserSocialAuth.objects.get(provider='vk-oauth2', user=request.user) vk_profile = vk_user.extra_data user_info = UserInfoGetter(vk_profile['access_token']) pers_id, first_name, last_name, photo_url = user_info.get_vk_info() # 创建或获取Profile,并关联当前用户 user_profile, created = Profile.objects.get_or_create( profile_id=pers_id, defaults={ 'user': request.user, 'first_name': first_name, 'last_name': last_name, 'photo_url': photo_url } ) # 如果已存在,更新信息 if not created: user_profile.first_name = first_name user_profile.last_name = last_name user_profile.photo_url = photo_url user_profile.save() # 重定向到home,无需传pers_id,后续直接从用户关联获取 return redirect('/home') except UserSocialAuth.DoesNotExist: pass return redirect(home)
3. 修改home视图,限制仅访问自己的Profile
去掉从GET参数获取pers_id的逻辑,直接通过当前登录用户关联的Profile获取数据,彻底避免越权:
@login_required def home(request): try: # 直接获取当前用户关联的Profile user_profile = request.user.profile except Profile.DoesNotExist: # 如果用户没有Profile(比如非VK登录的情况),可重定向到创建页面或返回错误 return redirect('/some-profile-setup-page') try: user_memories = Memory.objects.get(profile_id=user_profile.profile_id) except Memory.DoesNotExist: user_memories = False context = {'memories': user_memories, 'user_profile': user_profile} return render(request, 'home.html', context)
如果后续需要保留通过pers_id访问的逻辑(比如开放授权访问他人Profile的场景),可以添加权限验证:
@login_required def home(request): pers_id = request.GET.get('pers_id', None) if pers_id is None: # 默认返回自己的Profile try: user_profile = request.user.profile except Profile.DoesNotExist: return redirect('/some-profile-setup-page') else: try: user_profile = Profile.objects.get(profile_id=pers_id) except Profile.DoesNotExist: return redirect('/') # 仅允许访问自己的Profile if user_profile.user != request.user: from django.http import HttpResponseForbidden return HttpResponseForbidden("你无权访问该Profile") try: user_memories = Memory.objects.get(profile_id=user_profile.profile_id) except Memory.DoesNotExist: user_memories = False context = {'memories': user_memories, 'user_profile': user_profile} return render(request, 'home.html', context)
修改完成后,用户只能访问自己的Profile,无法通过篡改pers_id参数越权查看他人信息。
内容的提问来源于stack exchange,提问作者Ubuty_programmist_7
相关产品推荐
相关产品推荐

