Django Admin - 职员权限未生效
我觉得我可能漏掉了什么。我有一个 django 项目
(django 1.6,运行在ubuntu上),里面有几个应用,我想让一个用户管理一个特定的应用。这个过程应该很简单:选择用户,把他/她标记为 is_staff
,然后添加这个应用的权限。但现在并没有成功。
需要注意的是,我使用了一个自定义的 Authentication Middleware
来和我们的 SSO 服务器
进行身份验证。身份验证是正常的,但权限却不行。
在我的 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
可能是问题所在,但我不确定,也不知道该怎么解决。
任何帮助都将非常感激。
编辑 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 个回答
7
你的问题是这样的:
'django.contrib.auth.backends.ModelBackend'
不应该放在 MIDDLEWARE_CLASSES
里。
它应该放在 AUTHENTICATION_BACKENDS
里面。
因为在 AUTHENTICATION_BACKENDS
里没有合适的认证后端,所以用户的权限没有被识别出来。