2014-07-18 106 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