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

如何限制已授权用户访问他人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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:18:19