【问题标题】:Restricting access to only the is_superuser. is_staff can still access page限制仅对 is_superuser 的访问。 is_staff 仍然可以访问页面
【发布时间】:2014-03-05 16:15:29
【问题描述】:

我做错了什么?即使不是超级用户,is_staff 仍然可以访问此页面。你能在这里找到我的错误吗?

from django import forms
from django.conf import settings
from django.http import HttpResponse, HttpResponseRedirect, Http404
from ManagerApp import models as pmod
from . import templater
from django.contrib.auth.decorators import login_required
from django.contrib.auth.decorators import user_passes_test

@login_required(login_url='/ManagerApp/login/')
@user_passes_test(lambda u: u.is_superuser)

def process_request__new(request):
  q = pmod.User()
  q.first_name = 'New User!'
  q.save()
  return HttpResponseRedirect('/ManagerApp/edit_user/' + str(q.id))

def process_request(request):
  '''Shows all users in the DB'''
  q = pmod.User.objects.get(id=request.urlparams[0])
  form = UserForm(initial={
    #'active': q.is_active,
    'superuser': q.is_superuser,
    'staff': q.is_staff,
    'firstname': q.first_name,
    'lastname': q.last_name,
    'username': q.username,
    'password': q.password,
    'email': q.email,
    'street': q.street,
    'city': q.city,
    'state': q.state,
    'zipCode': q.zipcode,
    'phone': q.phone,
  })
  if request.method == 'POST':
    form = UserForm(request.POST)
    if form.is_valid():
      #q.is_active = form.cleaned_data['active']
      q.is_superuser = form.cleaned_data['superuser']
      q.is_staff = form.cleaned_data['staff']
      q.first_name = form.cleaned_data['firstname']
      q.last_name = form.cleaned_data['lastname']
      q.username = form.cleaned_data['username']
      q.set_password(form.cleaned_data['password'])
      q.email = form.cleaned_data['email']
      q.street = form.cleaned_data['street']
      q.city = form.cleaned_data['city']
      q.state = form.cleaned_data['state']
      q.zipcode = form.cleaned_data['zipcode']
      q.phone = form.cleaned_data['phone']
      q.save()
      return HttpResponseRedirect('/ManagerApp/users/')

  # return the template html
  template_vars = {
    'form': form,
  }
  return templater.render_to_response(request, 'edit_user.html', template_vars)

class UserForm(forms.Form):
  '''The question form'''
  #active = forms.NullBooleanField(required=False)
  superuser = forms.NullBooleanField(required=False)
  staff = forms.NullBooleanField(required=False)
  firstname = forms.CharField(required=False)
  lastname = forms.CharField(required=False)
  username = forms.CharField(required=False)
  password = forms.CharField(required=False)
  email = forms.CharField(required=False)
  street = forms.CharField(required=False)
  city = forms.CharField(required=False)
  state = forms.CharField(required=False)
  zipcode = forms.CharField(required=False)
  phone = forms.CharField(required=False)

我查了一堆教程,但仍然找不到正确限制超级用户访问的解决方案。

另外,在 edit_user 页面上,我让每个人都按他们的 ID 编制索引。因此 URL 将如下所示:ManagerApp/edit_user/1/(# 对应于客户 ID)

【问题讨论】:

  • 哪一页?你在这里有两种观点。我认为装饰器应该与第一个相关联,尽管很难说。
  • edit_user 页面无法识别 is_superuser。我可以添加一个用户,效果很好
  • 这不是很有帮助。你有两个视图,process_request__newprocess_request。你说的是哪一个?

标签: python django


【解决方案1】:

装饰器应用于单个函数。您的 user_passes_test 装饰器与 process_request__new 函数相关联,而不是与 process_request 函数相关联。

【讨论】:

  • 所以你是说我需要把装饰器放在我想让它生效的每个函数的前面?如果这么简单,我会 +1 你
  • 好的,很好用!现在我如何让它重定向到另一个网页而不是转到找不到 404 页面
  • 或者我应该打开另一个问题?
猜你喜欢
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 2011-01-02
  • 2017-05-17
  • 1970-01-01
  • 2013-07-11
相关资源
最近更新 更多