5

我正在尝试为 GAE 的 django-nonrel 获取基于角色的权限。

开箱即用,它似乎不起作用,可能是因为用户和组之间隐含的多对多关系,所以我找到并安装了http://www.fhahn.com/writing/Django-s- Permission-System-with-Django-Nonrel。根据文档,我将 permission_backend_nonrel 添加到 INSTALLED_APPS(在 djangotoolbox 之后),并将 AUTHENTICATION_BACKENDS 定义到 settings.py 中的适当类。

这让我克服了之前的问题(“DatabaseError: This query is not supported by the database.”),但我仍然卡住了,因为当我运行一个非常简单的示例时,当我认为我应该得到一组空权限时得到一些东西。下面是我能做的最简单的例子。它是由 python manage.py shell 在 django 框架中启动的——它是一个简单的小马商店。我正在尝试将用户添加到组,授予该组权限,然后将这些权限反映为用户拥有的权限集的一部分:

>>> from django.contrib.auth.models import Group, Permission, User
>>> from django.contrib.contenttypes.models import ContentType
>>> from pony_shop.models import Pony

#Create the group:
>>> farmers = Group(name="Farmers")
>>> farmers.save()

>>> pony_ct = ContentType.objects.get(app_label='pony_shop', model='pony')

#Create the Permission
>>> can_twirl = Permission(name='Can Twirl', codename='can_twirl', content_type=pony_ct)
>>> can_twirl.save()

#Give the Permission to the Group
>>> farmers.permissions.add(can_twirl)
>>> farmers.save()

#Create the User
>>> francis = User(username='francis')
>>> francis.save()

#Put the user in the group
>>> francis.groups.add(farmers)
>>> francis.save()

#Get a pony object
>>> firefly = Pony(price=12, height=3, name='Firefly', color='fuscia')
>>> firefly.save()

>>> francis.get_all_permissions()
set([]) #<-- WHY?!?

#Just in case I needed to check the permissions against a pony object:
>>> francis.get_all_permissions(obj=firefly)
set([]) #<-- Still no joy

所以,问题是:为什么上述方法不起作用,我需要改变什么才能使它起作用?

在此先感谢您的帮助!

4

4 回答 4

6

感谢一位同事,我得到了这个问题的答案。显然,我不需要使用内置的组/权限添加。相反,请使用 *permission_backend_nonrel* 附带的实用程序类

>>>from permission_backend_nonrel import utils
>>>utils.add_permission_to_group(can_twirl,farmers)
>>>utils.add_user_to_group(francis,farmers)

然后,它起作用了。

于 2011-07-16T17:44:57.847 回答
2

哦,作为更新,这里是新代码库的位置:https ://github.com/django-nonrel/django-permission-backend-nonrel

那里也包括说明:-)

于 2012-01-04T09:37:12.383 回答
1

要检查用户是否在组中,我使用下一个函数:

from django.contrib.auth.models import User, Group
from permission_backend_nonrel.models import UserPermissionList

def UserInGroup(User, groupName):
    group = Group.objects.get(name=groupName)
    up = UserPermissionList.objects.filter(user = User)
    try:
        return True if unicode(group.id) in up[0].group_fk_list else False
    except:
        return False
于 2012-05-24T20:16:55.490 回答
0

我有同样的问题,但我通过更改 AUTHENTICATION_BACKENDS 设置中的顺序来解决。权限后端 nonrel 应该在 ModelBackend 之前。

AUTHENTICATION_BACKENDS = (
    'permission_backend_nonrel.backends.NonrelPermissionBackend',
    'django.contrib.auth.backends.ModelBackend',
)
于 2013-05-08T19:03:23.113 回答