【问题标题】:django.contrib.auth: how to keep site and admin sessions separate?django.contrib.auth:如何将站点和管理会话分开?
【发布时间】:2023-03-16 16:08:01
【问题描述】:

我正在使用用户配置文件模型,该模型具有用户的 ForeignKey,由 django.contrib.auth 进行身份验证。

管理界面当然使用相同的身份验证模块,因此如果超级用户/员工登录管理界面并进入主站点,该站点将接受会话cookie并对其进行身份验证。这会产生一个问题,因为超级用户/管理员不需要拥有 UserProfile 并且不应被主站点识别。

解决此问题的最简单方法是什么,以便管理员的会话不会继续到站点?

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    我认为没有办法完全解决这个问题, “解决这个问题的最简单方法是什么,以便管理员的会话不会继续到站点?”

    但是根据你想做什么,你可以试试,

    1. 不要为超级用户创建 UserProfile

    如果 request.user.is_superuser():
    UserProf.objects.create(...)

    1. 我总是有一个问题,我想在开发时同时保持一个登录的管理员用户和一个登录的普通用户。为此,我在 /etc/hosts 中有两个条目

      127.0.0.1 uswaretech.tld
      127.0.0.1 admin.uswaretech.tld

    现在,普通用户始终通过 uswaretech.tld 登录,管理员始终通过 admin.uswaretech.tld 登录,因此您可以同时登录。

    【讨论】:

      【解决方案2】:

      从设计的角度来看,您的想法似乎有点像 hack,但如果您真的想这样做,您可以使用中间件。

      class MyMiddleware(object):
          def process_request(self, request):
              if request.user.is_authenticated:
                  try:
                      UserProfile.objects.get(user=request.user)
                  except UserProfile.DoesNotExist:
                      from django.contrib.auth.models import AnonymousUser
                      request.user = request._cached_user = AnonymousUser()
              return None
      

      这应该位于中间件列表的顶部,以防止可能的副作用。

      【讨论】:

      • 相当老套,我并不为此感到自豪,但这就是我所做的。
      【解决方案3】:
      if request.session.get ('has_account', False):
          return HttpResponse ("You have no account, sorry.")
      

      然后确保您前端的每个用户都能获得,如果他的会话被启动,has_account 的值设置正确。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 2012-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多