Django Admin - 职员权限未生效

4 投票
1 回答
3470 浏览
提问于 2025-04-18 13:53

我觉得我可能漏掉了什么。我有一个 django 项目(django 1.6,运行在ubuntu上),里面有几个应用,我想让一个用户管理一个特定的应用。这个过程应该很简单:选择用户,把他/她标记为 is_staff,然后添加这个应用的权限。但现在并没有成功。

需要注意的是,我使用了一个自定义的 Authentication Middleware 来和我们的 SSO 服务器 进行身份验证。身份验证是正常的,但权限却不行。

在我的 settings.py 文件中,我有:

MIDDLEWARE_CLASSES = (
   #[...]
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'middlewares.sso.SsoMiddleware', # My Custom Auth Middleware
    'django.contrib.auth.backends.ModelBackend',
   #[...]
)

总之,我的问题是:

  1. 当用户第一次访问这个应用时,他/她会被添加到 User 表中;
  2. 我进入 Admin Interface,把这个用户标记为 is_staff。他/她已经被标记为 is_active
  3. 这个用户现在可以进入 Admin Interface
  4. 但是,当我给他/她添加权限时,他/她仍然会看到“没有权限”的消息。
  5. 我唯一能让这个用户访问应用的方法是把他/她标记为 super_user,但这样他/她就能看到和修改所有应用,这并不是我想要的。

我感觉我的自定义 Auth Middleware 可能是问题所在,但我不确定,也不知道该怎么解决。

任何帮助都将非常感激。

编辑 1:process_request() 代码:

我在 sso.middleware 中的 process_request() 函数:

def process_request(self, request):
    if not hasattr(request, 'user'):
        raise ImproperlyConfigured();
    if "BBSSOToken" not in request.COOKIES:
        return self.redireciona_login(request)
    else:
        token = request.COOKIES["BBSSOToken"] #check token on cookies
        if token is not None:
            sso_server = "http://address.to.my.sso.server/sso/identity/attributes"
            try:
                opener = urllib2.build_opener()
                resposta = opener.open("%s?subjectid=%s" % (sso_server, token)).read()
                matricula = self.get_atributo(resposta, "userdetails.attribute.name=uid").upper() #user id
                nome = self.get_atributo(resposta, "userdetails.attribute.name=nm-idgl").upper() #name                    

                user = authenticate(username=matricula)
                request.user = user
                login(request, user)
            except urllib2.HTTPError, err:
                if err.code == 401:
                    return self.redireciona_login(request) #redirects to sso login page
        else:
            raise

    return
else:
    return self.redireciona_login(request) #redirects to sso login page

1 个回答

7

你的问题是这样的:

'django.contrib.auth.backends.ModelBackend' 不应该放在 MIDDLEWARE_CLASSES 里。

它应该放在 AUTHENTICATION_BACKENDS 里面。

因为在 AUTHENTICATION_BACKENDS 里没有合适的认证后端,所以用户的权限没有被识别出来。

撰写回答