我正在努力让基于角色的权限适用于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中的抽象模型继承权限?我真的找不到任何相关的东西.对我来说这不起作用!
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-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添加权限,它可以工作,但我想在同一个测试中更改它(使用和不使用权限进行测试).
提前致谢!
我在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-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
我知道已经有一个同样的问题,我也尝试过的解决方案,由于其但它力的工作对我来说因此我写我自己的问题。大家好,我正在使用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) 我有一个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”)
我试图在迁移中创建自定义权限,但是运行 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 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
我曾经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 ×9
django-admin ×2
abstract ×1
django-2.1 ×1
django-views ×1
django-wsgi ×1
python ×1
python-3.x ×1