我想我在这里遗漏了一些东西。我有一个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',
#[...]
)
无论如何,我的问题是:
User
表中; Admin Interface
并将该用户标记为is_staff
。他已被标记为is_active
。Admin Interface
。super_user
,但当然他/她可以查看和更改所有应用,这不是我的目标。我觉得我的自定义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
答案 0 :(得分:2)
你的问题是:
'django.contrib.auth.backends.ModelBackend'
不应该在MIDDLEWARE_CLASSES
...它应该在AUTHENTICATION_BACKENDS
中。
由于AUTHENTICATION_BACKENDS
中没有适当的身份验证后端,因此无法识别用户的权限。