标签: django-permissions

如何在Django-nonrel for Google App Engine中使用组权限

我正在努力让基于角色的权限适用于GAE的django-nonrel.

开箱即用,它似乎没有用,可能是因为用户和组之间存在隐含的多对多关系,所以我发现并安装了http://www.fhahn.com/writing/Django-s-权限 - 系统与Django-Nonrel.根据文档,我将permission_backend_nonrel添加到INSTALLED_APPS(在djangotoolbox之后),并将AUTHENTICATION_BACKENDS定义到settings.py中的相应类.

这让我超越了早期的问题("DatabaseError:数据库不支持此查询."),但我仍然卡住,因为当我运行一个非常简单的示例时,我得到一组空的权限,当我相信我应该得到回报.以下是我能做的一个简单的例子.它是由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
>>> …
Run Code Online (Sandbox Code Playgroud)

django-permissions django-nonrel google-cloud-datastore

5
推荐指数
1
解决办法
1188
查看次数

Django:继承抽象模型的权限?

是否可以从Django中的抽象模型继承权限?我真的找不到任何相关的东西.对我来说这不起作用!

class PublishBase(models.Model): 
    class Meta:
        abstract = True
        get_latest_by = 'created'
        permissions = (('change_foreign_items',
                        "Can change other user's items"),)
Run Code Online (Sandbox Code Playgroud)

编辑:不工作意味着它无声地失败.不会创建权限,因为在从此类继承的模型上不存在权限.

django django-models abstract django-permissions

4
推荐指数
2
解决办法
2373
查看次数

在django中的unittest期间无法更改用户权限

我最终决定对我的应用程序进行一些测试,但是如果用户可以更改另一个用户,我会坚持测试(取决于用户的类型 - 我使用django-rules来进行逻辑权限检查,但这并不重要)

这是我到目前为止的代码

class RulesAndPermissionsTests(TestCase):
    fixtures = ['auth_no_permissions.json', 'profiles.json', 'rules.json']

    def setUp(self):
        self.c = Client()
        self.user = User.objects.get(username="estagiario")
        self.non_staff = User.objects.get(username="fisica")
        self.admin = User.objects.get(username="admin")
        login = self.c.login(username='estagiario', password='estagiario')

    def test_can_change_non_staff_users(self):
        self.assertFalse(self.user.has_perm('logical_change_user', self.non_staff.profile)) # can't change non staff users without permission

        # now add the permission and test it again
        self.user.user_permissions.add(Permission.objects.get(codename='change_user'))
        print self.user.get_all_permissions() # prints set([])
        self.assertTrue(self.user.has_perm('logical_change_user', self.non_staff.profile))
Run Code Online (Sandbox Code Playgroud)

即使在添加权限后,我的用户仍然没有权限.这是因为我不允许在测试期间创建任何东西(这是一种不好的做法吗?)?或者django以某种方式缓存权限?如果我在setUp添加权限,它可以工作,但我想在同一个测试中更改它(使用和不使用权限进行测试).

提前致谢!

django django-testing django-permissions

4
推荐指数
1
解决办法
2702
查看次数

在 Django 中设置组/用户的权限

我在auth_group桌子上有一个小组。我需要为组设置权限。表中有一组权限auth_permission。现在,如果我需要将所有权限映射到一个组,是否需要为每个权限添加不同的行,还是可以通过将所有权限添加为 1 和 0 的字符串来完成?

例如:- 我应该在表中添加条目作为

id,group_id,permission_id

1,1,1
2,1,2
3,1,3
4,1,4
Run Code Online (Sandbox Code Playgroud)

或者有什么办法,我可以在一个字符串中添加所有权限,例如1234,每个数字表示一个permission_id?

django django-permissions

4
推荐指数
1
解决办法
1445
查看次数

如何在一个类视图中设置多个权限,取决于http请求

我正在使用 django-rest-framework。我遇到的问题是 POST 和 GET 方法的 url 是相同的,但我希望根据调用的方法具有不同的权限。现在我正在使用基于类的视图,我无法弄清楚如何根据方法设置不同的权限。我想要的是,如果用户是 POST 和 GET 的管理员,如果用户经过身份验证而不是只能 GET,并且如果用户未经过身份验证,他们将无法执行任何操作。

class CategoryList(generics.ListCreateAPIView):
    queryset = QuestionCategory.objects.all()
    serializer_class = QuestionCategorySerializer
    permission_classes = (permissions.IsAuthenticated,)
Run Code Online (Sandbox Code Playgroud)

django django-views django-permissions django-rest-framework

4
推荐指数
1
解决办法
4803
查看次数

/ admin / login /的Django :: OperationalError无法打开数据库文件

我知道已经有一个同样的问题,我也尝试过的解决方案,由于其但它力的工作对我来说因此我写我自己的问题。大家好,我正在使用apache2服务器部署django服务器,当我尝试我的主机ip地址时,它可以正常工作,因为它显示了它的“工作页面”,它也适用于IPADRESS / admin,但是在填写凭据并按Enter后,将产生此错误

***OperationalError at /admin/login/
unable to open database file***
Run Code Online (Sandbox Code Playgroud)

我的错误看起来像

Environment:


Request Method: POST
Request URL: http://192.168.1.105/admin/login/?next=/admin/

Django Version: 1.7.4
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'managementdashboard')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/var/www/dashboardapp/env/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/var/www/dashboardapp/env/lib/python2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  52.         response = view_func(request, *args, **kwargs)
File "/var/www/dashboardapp/env/lib/python2.7/site-packages/django/contrib/admin/sites.py" in login
  361.         return …
Run Code Online (Sandbox Code Playgroud)

django django-admin django-wsgi django-permissions

4
推荐指数
1
解决办法
5409
查看次数

基于模型字段值的django访问控制

我有一个Department带田野的模型课name。我还有一个Student带有外键的模型Department。我想Student根据部门控制对对象的访问。即,具有编辑名称为“ CS”的部门的权限的用户只能编辑该字段。如何在Django中实现?(我正在使用Django 1.8,python3)

编辑

class Department(models.Model):
    name = models.CharField(_('department name'), max_length=255)

class Students(models.Model):
    first_name = models.CharField(_('first name'), max_length=30)
    last_name = models.CharField(_('last name'), max_length=30)
    department = models.ForeignKey('Department')
Run Code Online (Sandbox Code Playgroud)

另外,我在添加新部门时动态创建所需的权限(例如:如果新条目的department.name是“ CS”,将创建2个权限,例如“ view_CS”和“ edit_CS”)

python django django-permissions

4
推荐指数
1
解决办法
1987
查看次数

创建数据迁移自定义权限

我试图在迁移中创建自定义权限,但是运行 migrate 后,权限表中未创建该权限。有人能指出错误是什么吗?另外,我不确定应该使用什么作为 ContentType 的相关模型,因为该权限用于限制可以查看显示网站上用户摘要的页面的用户。任何帮助将不胜感激,谢谢。

def add_view_aggregated_data_permissions(apps, schema_editor):
    ContentType = apps.get_model('django', 'ContentType')
    Permission = apps.get_model('auth', 'Permission')
    content_type = ContentType.objects.get(app_label='auth', model='user')
    permission = Permission.objects.create(codename='can_view_data',
                                           name='Can view data',
                                           content_type=content_type)
Run Code Online (Sandbox Code Playgroud)

django django-permissions django-migrations

4
推荐指数
1
解决办法
4564
查看次数

Django 从 2.0 迁移到 2.2(查看权限问题)

在迁移与迁移相关的 Django Facing 问题时:

python manage.py migrate demo --database demo

获取与以下相关的错误:

ValueError:无法分配“ContentType:ContentType 对象 (1)”:当前数据库路由器阻止了这种关系。

Detailed Error Log : https://ideone.com/z6NPkq
Run Code Online (Sandbox Code Playgroud)

经测试的 Django 版本:在 Django 版本2.0.13 之后,面临这个问题。

让我知道这可能是什么原因?

编辑:在 Django 2.1 中找到原因,他们添加了查看权限:

为什么查看权限没有自动生成?

解决方案:在Django模块中,如果我们将移动到文件路径:django/contrib/auth/management/__init.py

我们必须更改行号:79

Permission(codename=codename, name=name, content_type=ct)
Run Code Online (Sandbox Code Playgroud)

Permission(codename=codename, name=name, content_type_id=ct.id)
Run Code Online (Sandbox Code Playgroud)

我在 Django 内部调试后找到了这个解决方案,但仍然无法理解为什么会发生这种情况。让我知道其他解决方案以及此解决方案的任何原因。

EDIT-1:寻找答案,这样我就不必更改核心 Django 模块(库)。

解决方案1

def allow_relation(self, obj1, obj2, **hints):
    if obj1._state.db == "demo" or obj2._state.db=="demo":
        return True
    return obj1._state.db == obj2._state.db 
Run Code Online (Sandbox Code Playgroud)

注意:在我的情况下,其他数据库使用演示数据库表作为参考,因此在Approuter 类中自定义了allow_relation方法。

django django-admin django-permissions python-3.x django-2.1

4
推荐指数
1
解决办法
1008
查看次数

使 PermissionRequiredMixin 还检查对象级别权限

我曾经Django Guardian拥有对象级权限和全局权限。有些用户拥有具有全局权限的组,有些则具有对象级权限。这样,我似乎需要修改PermissionRequiredMixin以检查对象级权限。

views.py

class MainPageView(PermissionRequiredMixin, TemplateView):
    permission_required = "app.view_mainpage"
    template_name = "web/mainpage.html"
Run Code Online (Sandbox Code Playgroud)

如果用户具有全局权限,则此方法有效,但如果用户位于具有对象级权限的组下,则无效。使用监护人,要检查对象级权限,还必须传递对象实例。

例子:

self.request.user.has_perm('view_mainpage', obj)
Run Code Online (Sandbox Code Playgroud)

然后PermissionRequiredMixin,检查就这样进行,self.request.user.has_perms(perms)

那么,如果用户有一个具有view_mainpage特定对象权限的组,我该如何检查它呢?顺便说一句,我的所有权限都是一样的content_type。我有什么办法可以执行这个吗?PermissionRequiredMixin就像如果用户位于对象级组下以及None用户位于全局组下时我必须将对象实例传递给一样。

django django-permissions django-guardian

4
推荐指数
1
解决办法
992
查看次数