django - 如何限制未经授权的用户访问 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
解决方案
试试这个:
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
;的用户配置文件。这是更清洁的方式。
推荐阅读
- python - Matplotlib 在循环中创建多个图表的单个 pdf
- javascript - 使用 d3.js 向 svg 添加注释(文本 + 行)的功能?
- google-apps-script - 我可以在谷歌应用程序中存储和访问“通用”变量吗?
- julia - Julia 中的可拖动轴滑块
- python - 为什么当我尝试运行 import 语句时出现 ModuleNotFoundError?
- ios - iOS 键盘未在 WKWebView 上完全隐藏
- python - AWS Lambda:将消息转发到 Telegram 机器人
- css - Firefox 上的 CSS 变换比例“故障”
- drupal - 远程主机出错,本地一切正常
- cross-compiling - 如何在 nix 包中指定主机和构建平台(在 Nix 中进行交叉编译)