【问题标题】:How to restrict unauthorized user to have access to different pages in django如何限制未经授权的用户访问 django 中的不同页面
【发布时间】:2020-03-25 13:55:38
【问题描述】:

我有这个模型:

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

【问题讨论】:

    标签: django security decorator login-required


    【解决方案1】:

    试试这个:

    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):
        #...
    

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

    【讨论】:

    • 我已经简化了这个问题。我有不同的用户类型。我有老师和学生。教师可以登录并注册学生。然后我有这个网址:teachers/2/student/1 和这个网址students/1
    • 因此您可以保留您的 teachers/2/student/&lt;id&gt; 网址(并将其限制为仅限教师),但每个学生的个人资料都有 student/profile
    • @AminBa 我接受了你的请求;感谢那。还可以考虑将答案标记为已接受或告诉我们有什么问题。
    猜你喜欢
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多