0
我有一个网站上运行的几个管理实例 - 每个国家,该网站支持一个。django多个管理实例和锁定访问特定实例
但是,如果用户登录到一个管理员,他们将自动能够访问其他实例。
我需要使auth代码知道用户已登录哪个管理员并阻止访问其他管理员系统。
任何想法如何做到这一点?
我有一个网站上运行的几个管理实例 - 每个国家,该网站支持一个。django多个管理实例和锁定访问特定实例
但是,如果用户登录到一个管理员,他们将自动能够访问其他实例。
我需要使auth代码知道用户已登录哪个管理员并阻止访问其他管理员系统。
任何想法如何做到这一点?
您可以使用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