2011-10-16 102 views
0

我有一个网站上运行的几个管理实例 - 每个国家,该网站支持一个。django多个管理实例和锁定访问特定实例

但是,如果用户登录到一个管理员,他们将自动能够访问其他实例。

我需要使auth代码知道用户已登录哪个管理员并阻止访问其他管理员系统。

任何想法如何做到这一点?

回答

0

您可以使用middleware来检查用户访问管理站点某些区域的权限。结帐这snippet。 (您可能想了解有关处理custom permissions in 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