我想我在这里错过了一些东西。我有一个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',
#[...]
)
不管怎么说,我的问题是:
- 当用户访问应用程序第一次,他(她)被添加/到
User
表; - 我去
Admin Interface
并标记该用户为is_staff
。他已被标记为is_active
。 - 用户现在可以进入
Admin Interface
。 - 但是,当我向他添加权限时,他/她仍然会收到“无权限”消息。
- 我的用户访问该应用程序的唯一方法是当我将他标记为
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
你给用户什么权限? – elssar
为什么你在中间件中有auth后端?你可以展示你的中间件类吗? – ilvar
@elssar我可以给他任何许可。即使我点击选择所有权限(使用is_active和is_staff)标记。我没有工作。用户只能在is_admin时执行操作。 – aldux