在我的Django项目中,我拥有由Django内置的身份验证系统创建的各种用户。每个用户都可以创建自己的App
模型实例。我想限制用户访问对象,以便用户只能查看他们创建的实例。为此,我创建了这个视图:
@login_required
def appDetail(request, app_id):
try:
app = App.objects.get(pk=app_id)
# Testing if the currently logged in user is
# the same as the user that created the 'app':
if request.user.id == app.user.user.id:
if request.method == 'POST':
form = AppForm(request.POST, instance=app)
if form.is_valid():
edited_app = form.save()
return HttpResponseRedirect('/thanks/')
else:
form = AppForm(instance=app)
# If 'app' does not belong to logged in user, redirect to 'accessdenied' page:
else:
return HttpResponseRedirect('/accessdenied/')
except LeaveApp.DoesNotExist:
raise Http404
return render(request, 'AppDetail.html', {'form':form})
它有效,但我想知道是否有更普遍接受和/或安全的方法来做到这一点?
答案 0 :(得分:1)
这称为行级权限,这是一个非常常见的问题。有关解决此问题的所有应用,请参阅here。
如果您需要进行特定测试,请选择与您类似的自定义解决方案(但是,因为它是样板,所以最好将其移至装饰器)。否则,只需使用现有的应用程序。
答案 1 :(得分:1)
我会将表单提交放在不同的视图中并编写一个自定义装饰器,您也可以将其用于类似的问题。 我也会返回404而不是拒绝访问。您可能不希望向用户显示您正在保护某些内容。
答案 2 :(得分:1)
有一个名为user_passes_test的装饰器,根据用户是否通过某项检查来限制对视图的访问
from django.contrib.auth.decorators import login_required, user_passes_test
@login_required
@user_passes_test(lambda user: user.username == app.user.user.id)
MyView(request):
...
您还可以添加一个可选参数,以便在检查失败的情况下重定向到网址。
尝试从管理页面执行此操作也非常简单,但需要执行一些额外步骤。