2014-07-18 85 views
3

我想我在这里错过了一些东西。我有一个django project(django 1.6,Ubuntu的盒子),其中有几个应用程序,我想让一个用户管理一个特定的应用程序。它应该很简单:选择用户,将他/她标记为is_staff并添加应用程序的权限。但这不起作用。Django的管理员 - 权限不适合员工

请务必注意,我使用自定义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,但他/她当然可以看到并更改所有应用程序,这不是我的目标。

我有一种感觉,我的自定义Auth Middleware是culprid,但我不知道如何解决它。

任何帮助将非常感激。

编辑1:process_request()代码:

的process_request()我sso.middleware功能:

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 
+0

你给用户什么权限? – elssar

+1

为什么你在中间件中有auth后端?你可以展示你的中间件类吗? – ilvar

+0

@elssar我可以给他任何许可。即使我点击选择所有权限(使用is_active和is_staff)标记。我没有工作。用户只能在is_admin时执行操作。 – aldux

回答

1

你的问题是这样的:

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

...应该在AUTHENTICATION_BACKENDS之内。

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

+0

我有这个配置,但仍然工作人员无法看到任何东西,并编辑管理员分配的项目。任何猜测? – 89n3ur0n