首页 > 解决方案 > 如何限制未经授权的用户访问 django 中的不同页面

问题描述

我有这个模型:

class Student(Model):
    user = OneToOneField(CustomUser, on_delete=CASCADE, related_name='student', )

这个网址:

path('students/<int:student_pk>/', student, name='student')

这个观点:

@login_required
def student(request, student_pk):
    return HttpResponse('This is your personal panel')

好吧,通过使用 login_required 装饰,我限制未登录的用户查看学生面板页面。但是,其他登录的学生可以看到其他人的面板。

我怎样才能限制他们这样做?

我可以做这个:

@login_required
def student(request, student_pk):
    student_ins = get_object_or_404(Student, pk=student_pk)
    if student_ins == request.user.student:
        return HttpResponse('This is your personal panel')
    else:
        return HttpResponse('Please do not try to see other students' panels! You are not authorized to do this')

但是,我更喜欢在装饰器中进行。例如,如果他/她在 url 中输入了主键 pk=1,则注销登录的学生:www.example.com/students/2

标签: djangosecuritydecoratorlogin-required

解决方案


试试这个:

from django.contrib.auth import logout

def check_profile(function):
  @wraps(function)
  def wrap(request, *args, **kwargs):
      user = request.user
      student_ins = get_object_or_404(Student, pk=kwargs.get(student_pk))
      if not student_ins == user:
          logout(request)
          return HttpResponse('Please do not try to see other students' panels! You are not authorized to do this')
  return wrap

并使用它:

@check_profile
@login_required
def student(request, student_pk):
    #...

这应该可以满足您的需求,但请记住,这通常不是一个好主意,除非您有非常特殊的用例。基本上,你应该做的是有一个类似的 url/profile/并显示基于request.user;的用户配置文件。这是更清洁的方式。


推荐阅读