Django несколько экземпляров администратора и блокировка доступа к конкретному экземпляру - PullRequest
0 голосов
/ 16 октября 2011

На сайте запущено несколько экземпляров администратора - по одному для каждой страны, которую поддерживает сайт.

Однако, если пользователь входит в систему с одним администратором, он автоматически получает доступ к другим экземплярам.

Мне нужно, чтобы код авторизации знал, к какому администратору выполнил вход пользователь, и запретить доступ к другим системам администратора.

Есть идеи, как это можно сделать?

1 Ответ

0 голосов
/ 16 октября 2011

Вы можете использовать middleware для проверки прав доступа пользователей к определенным областям сайта администратора. Оформить заказ фрагмент . (Возможно, вы захотите узнать больше об обработке пользовательских разрешений в Django .)

Если вам нужно что-то более универсальное, вы можете использовать приведенный ниже пример кода. Идея проста: он использует пользовательские функции, чтобы узнать о правах пользователя и дать соответствующий ответ:

#coding: utf-8
# Note that RESTRICTED_URLS tuple takes three parameters: url regex, function to check
# whether user has certain permission, and a function to redirect the user to a certain 
# page if he doesn't have sufficient rights.
import re
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
from django.http import HttpResponseRedirect
from django.contrib import messages
from backend.models import Professional
from django.contrib.auth.decorators import permission_required

def calculate_forbidden_response(request, view_func,view_args,view_kwargs):
    if not request.user.is_authenticated():
        return permission_required('')(view_func)(request,*view_args,**view_kwargs)
    elif request.user.has_perm('backend.p_add_professional'):
        messages.error(request, _('You need permission Spam to enter this cabinet.'))
        return HttpResponseRedirect('/some_help_page_about_permissions.html')

def check_professional_permission(request):
    return request.user.has_perm('backend.p_access_professional_cabinet')

RESTRICTED_URLS = (
                    (r'/professional/(.*)$', check_professional_permission, calculate_forbidden_response),
                  )
RESTRICTED_URLS_EXCEPTIONS = ()

class CheckPermissionMiddleware(object):
    def __init__(self):
        self.restricted = tuple([(re.compile(url[0]), url[1], url[2]) for url in RESTRICTED_URLS])
        self.exceptions = tuple([re.compile(url) for url in RESTRICTED_URLS_EXCEPTIONS])

    def process_view(self,request,view_func,view_args,view_kwargs):
        if request.user.is_superuser:
            return None
        for path in self.exceptions:
            if path.match(request.path): return None
        for rule in self.restricted:
            url, permission = rule[0], rule[1]
            calculated_response = rule[2]
            if url.match(request.path):
                if not permission(request):
                    return calculated_response(request, view_func,view_args,view_kwargs)
                else:
                    return None
        return None
...