Как дать разрешения пользователю django? - PullRequest
0 голосов
/ 19 июня 2019

Здесь я пытаюсь дать сотрудникам некоторые определенные разрешения. Я пробовал вот так. Этот код сохраняет все проверенные разрешения в таблице базы данных auth_user_user_permissions, а также отображает добавленные разрешения для конкретного пользователя в шаблоне, но пользователиЯ не могу использовать эти разрешения. Например, я добавил только разрешение user can view product, и это разрешение добавляется в таблицу, но когда я выполняю действие add product с этим пользователем, я могу выполнять это действие, даже если яне дал этой роли действия этому пользователю.

views.py

Изначально я ограничиваю пользователей вводом URL-адреса администратора, если пользовательне суперпользователь и персонал

class RestrictUserMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if request.path.find("/admin/") > -1:
           if not request.user.is_superuser and not request.user.is_staff:
              messages.error(request,'You have no permission to view this page')
              return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

        response = self.get_response(request)
        return response

settings.py

  middleware = 'app.views.RestrictUserMiddleware',

views.py

def update_user_roles(request,id):
     user = get_object_or_404(User, id=id)
     user_permissions = Permission.objects.all()

if request.method == 'POST':
    permissions = request.POST.getlist('user_permissions')
    print('hey',permissions)
    form = EditUserRole(request.POST or None,instance=user)
    if form.is_valid():
        role = form.save(commit=True)
        role.save()
        user.user_permissions.set(permissions)

        messages.success(request,'Roles updated for user '.format(user.username))
        return redirect('user_profile',user.id)
else:
    form = EditUserRole()
return render(request,'update_user_role.html',{'form':form,'user':user,'user_permissions':user_permissions})

add_product

def add_product(request):
    categories = Category.objects.all().order_by('-updated')
    if request.method == 'POST':
        form = AddProductForm(request.POST or None, request.FILES or None)

        if form.is_valid():
            product = form.save(commit=False)
            product.save()
            messages.success(request, '{} added.'.format(product.name))
            return redirect('add_product')
    else:
        form = AddProductForm()
    return render(request, 'add_product.html', {'form': form,
                                                    'categories': categories})

шаблон

<form action="{% url 'update_user_role' user.id %}" method="post" >
                        {% csrf_token %}

                        <div class="form-group">
                            <h5>User Roles</h5>
                               <div class="controls">
                         {% for permission in user_permissions %}
                         <input name ="user_permissions" type="checkbox" id="permission-{{permission.id}}"  value="{{permission.id}}" {% if permission in user.user_permissions.all %} checked="checked" {% endif %}>
                         <label for="permission-{{permission.id}}">{{permission.name}}</label>
                         {% endfor %}
                       </div>
                        </div>

                        <div>
                            <button type="submit" class="btn btn-info">Save</button>
                        </div>
                    </form>

forms.py

class EditUserRole(forms.ModelForm):
    class Meta:
        model = User
        fields = ['user_permissions']

1 Ответ

1 голос
/ 19 июня 2019

Как я уже говорил в комментарии, Django не предпринимает никаких действий для обеспечения прав доступа вне прав администратора (как он может определить, к какому виду относится разрешение)?

Тебе нужно сделать это самостоятельно; Самый простой способ - использовать декоратор permission_required . Например:

@permission_required('products:change_product') # or whatever your permission is called
def update_user_roles(request,id):
    ...
...