Django管理员 - 没有为员工挑选的权限

时间:2014-07-18 18:42:06

标签: python django django-admin django-authentication

我想我在这里遗漏了一些东西。我有一个django project(django 1.6,ubuntu框),其中有几个应用程序,我希望一个用户管理一个特定的应用程序。它应该很简单:选择用户,将他/她标记为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',
   #[...]
)

无论如何,我的问题是:

  1. 当用户第一次访问应用程序时,他/她被添加到User表中;
  2. 我转到Admin Interface并将该用户标记为is_staff。他已被标记为is_active
  3. 用户现在可以进入Admin Interface
  4. 但是,当我向他添加权限时,他/她仍然会获得"没有权限"消息。
  5. 我的用户访问该应用的唯一方法是将我标记为super_user,但当然他/她可以查看和更改所有应用,这不是我的目标。
  6. 我觉得我的自定义Auth Middleware是culprid,但我不确定也不知道如何修复它。

    任何帮助都将受到极大的赞赏。

    编辑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 个答案:

答案 0 :(得分:2)

你的问题是:

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

...它应该在AUTHENTICATION_BACKENDS中。

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