python - Django hook 根据站点拒绝用户访问管理员

标签 python django django-admin

我们有一个包含多个站点的 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/

相关文章:

Python 脚本运行时间更长

python - 我想向 Pandas 数据框添加一个新索引

python - 查找至少一行包含字母的列

python - Django 中 CBV 的设计

django - 无法访问正在运行的Django服务器?

django - 如何在 Geodjango 的管理员中更改 map 的默认缩放级别?

django - 消息 - 找不到已安装的 python-django 或 python3-django 版本

Python networkx 和持久性(可能在 neo4j 中)

javascript - Django 上的 jquery 未加载

django - 当通过 django-admin.py 启动一个新的 django 项目时,有没有办法注入(inject)我自己的变量?