我们有一个包含多个站点的 Django 项目(使用站点框架的派生),其中每个站点都是我们域的子域。我需要能够根据用户是否拥有网站的外键来拒绝某些员工用户(具有网站外键的自定义用户模型的实例)对管理网站的访问。
自定义用户模型基本上如下所示:
class SiteTenantUser(AbstractUser):
site = models.ForeignKey(Site, null=True)
您的第一 react 可能是建议我们阻止使用自定义 SiteAuthBackend
身份验证后端的 authenticate
方法进行身份验证,以便只让用户登录自己的网站。这可以防止身份验证,但诀窍是我们的 super 用户确实具有跨站点访问权限,因此我们希望使用通配符 session cookie (.ourdomain.com) 让 super 用户无需登录即可从一个站点转到另一个站点在每一次。然而,通过这样做,我们现在除了身份验证
之外还需要一些东西来防止没有该权限的用户进行跨站点访问。否则,他们可以针对自己的站点进行身份验证,然后切换到另一个站点的管理 URL 并进行合法 session 并进入。
总而言之,虽然我们的自定义身份验证后端会阻止非 super 用户员工用户(仅限于单个站点)登录到另一个站点的管理员,但它不会阻止他们登录到自己的管理员,然后切换到另一个网站的管理员。是否有一个简单的 Hook 来防止这种情况,类似于 Django 将拒绝任何管理页面中没有 is_staff
的用户,无论他们是否经过身份验证?
PS 我们有一个全局 get_current_site
方法,它使用中间件的缓存值,可以在任何地方工作,不需要请求。
最佳答案
您可以创建自定义中间件来拒绝用户访问。将其添加到 AuthenticationMiddleware
之后的 MIDDLEWARE_CLASSES
中。
from django.http import HttpResponseForbidden
class CheckUserSiteMiddleware(object):
def process_request(self, request):
if (request.path.startswith('/admin/') and
request.user.is_authenticated() and
user.site != get_current_site()):
return HttpResponseForbidden()
关于python - Django hook 根据站点拒绝用户访问管理员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27934918/