2016-03-24 3 views
1

Джанго: Развязка Разрешения-Check из Вызова View

Я хотел отвязать разрешение проверки в Джанго.Джанго: Развязка Разрешение-Check из Вызова View

Текущий откат: если вы используете декораторы, такие как login_required, то вы не можете заранее знать, имеет ли пользователь разрешение на это или нет.

Я хотел бы разделить это на два этапа:

  1. проверки прав доступа
  2. вызова вид.

Use Case 1: инструмент администратора

Я хочу инструмент для администраторов, где они могут проверить разрешения_доступ пользователей. Для этого требуется:

  1. Проверка не должна использовать текущий request.user, так как это неправильный пользовательский объект.
  2. Проверка не должна фактически вызывать представление, так как это может изменить данные.

Использование варианта 2: Показать ссылку как отключенную.

Я хочу показать ссылки как отключенные (выделенные серым цветом и без «href»), если у пользователя нет разрешения на просмотр связанной страницы.

Сон

Возвращение булево для «хорошо» и «разрешение отказано» приятно. Но большая выгода была бы, если бы администратор мог получить разум.

Пример: открывает

  1. Admin "Check Пермь Tool"
  2. Он выбирает вид/URL
  3. хиты админ "Submit"

Результат:

------------------------------ 
| User  | Allowed | Reason 
------------------------------ 
| fooadmin | Yes | is_superuser 
| foouser | No  | missing permission "view-bar-at-midnight" 
| foobar | Yes | User has permission "view-bar-at-midnight" 

Вопрос

Как осуществить эту мечту?

... Просто для записей, я отправил идею о Джанго-разработке списка: https://groups.google.com/forum/#!topic/django-developers/rpTh4G3BgIQ

+2

Его неясно, что вы спрашиваете о, если пользователь не вошел в систему, то они не имеют права – Sayse

+0

@Sayse от того, что я понимаю, guettli хочет функция «Просмотр веб-сайта как X» (где X - любой пользователь). –

+0

Итак, я не уверен, как вы хотите, чтобы проверка разрешений работала в ** Использовать случай 1 **. Если вы в порядке с интерфейсом администратора Django, в 'http: // domain/admin', то это решается путем добавления логической переменной (или некоторого значения, если у вас больше разновидностей разрешений) для разрешений в вашей модели пользователя, которые вы можете просмотреть в таблице интерфейса администратора с использованием [Model Admin Object] (https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#modeladmin-objects) в 'admin.py'. –

ответ

3

Я предполагаю, что у вас уже есть список всех разрешений, необходимых для просмотра каждого вида/URL? Т.е. вы знаете, что для URL /bar требуются разрешения superuser и view-bar-at-night раньше времени?

Если это так, попробуйте добавить ViewPermissions модель для models.py первого:

from django.db import models 

class ViewPermissions(models.Model): 
    view_url = models.CharField(help_text="The URL of this view") 

Тогда в admin.py:

from models import ViewPermissions 
from django.contrib.admin.widgets import FilteredSelectMultiple 
from django.contrib.auth.models import Permission 
from django.contrib import admin 
from django import forms 

class ViewPermissionFormField(forms.ModelForm): 
    permissions = forms.ModelMultipleChoiceField(
     widget=FilteredSelectMultiple("Permissions", is_stacked=False), 
     queryset=models.Permission.objects.all() 
    ) 

    def save(self, commit=True): 
     extra_field = self.cleaned_data.get('extra_field', None) 
    return super(ViewPermissionFormField, self).save(commit=commit) 

    class Meta: 
     fields = '__all__' 
     model = ViewPermissions 

class ViewPermissionsAdmin(admin.ModelAdmin): 
    form = ViewPermissionsFormField 
    fieldsets = (
     (None, { 
      'fields': 'view_url', 'permissions' 
     }) 
    ) 

Теперь вы можете добавить разрешения для каждого вида URL в администратора, чтобы следить за вещами , FYI вы можете create your own custom permissions и добавить их в существующие Django.

Вы можете создать форму администратора, которая вытаскивает пользователей, перечисляет их разрешения, а затем использует ViewPermissions, чтобы узнать, какие URL-адреса могут посещать пользователи на основании того, какие разрешения у них есть (пример использования 1).

Теперь вы можете проверить разрешение пользователя в вашей функции зрения (или класс, если это, как вы определяете свои взгляды) следующим образом:

from django.contrib.auth.models import Permission 
from models import ViewPermissions 

def my_view(request) 
    view_url = request.get_current_url() 
    permissions_required = ViewPermissions.objects.filter(view_url = view_url).permissions 
    context['user_permissions'] = [] 
    for p in permissions_required: 
     if request.user.has_permission(p): 
      context['user_permissions'].append(p) 

Теперь вы можете передать эти права в шаблон и серым цветом (см. пример 2).

Так что-то подобное, что могло бы работать ...

+0

Мне нравится это решение. Хранение разрешений в DB-модели .... приятно. – guettli

Смежные вопросы