Django Admin - 没有为员工获取权限

ald*_*dux 4 python django django-admin django-authentication

我想我在这里遗漏了一些东西。我有一个django project(django 1.6,ubuntu box),里面有几个应用程序,我希望一个用户管理一个特定的应用程序。它应该很简单:选择用户,将他/她标记为is_staff并添加应用程序的权限。但这行不通。

重要的是要注意,我正在使用自定义Authentication Middleware来验证我们的SSO Server. 身份验证工作正常。权限不是。

在我的settings.py我有:

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

无论如何,我的问题是:

  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
Run Code Online (Sandbox Code Playgroud)

Ane*_*pic 7

你的问题是这样的:

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

...它应该在AUTHENTICATION_BACKENDS

由于没有适当的身份验证后端,因此AUTHENTICATION_BACKENDS无法识别用户的权限。