python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > django用户、用户组及权限设置

django之用户、用户组及权限设置方式

作者:dangfulin

这篇文章主要介绍了django之用户、用户组及权限设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

一,django中超级用户与普通用户的本质区别

首先要明确的是,Django的身份验证框架中只存在一个用户类,也就是说,“超级用户”或“普通用户”只是设置了特殊属性的用户对象,而不是用户对象的不同类别。

1,当使用命令python manage.py createsuperuser后

打开数据库中的用户表user_myuser,is_superuser、is_staff和is_active都被置为1。

如下图:

2,使用命令创建普通用户后

>>> python manage.py shell
>>> from user.models import MyUser
>>> user = MyUser.objects.create_user('jack', 'lennon@thebeatles.com', 'jackpassword')
>>> user.save()
>>> user
<MyUser: jack>

打开数据库中的用户表user_myuser,发现普通用户仅iis_active被置为1。

如下图:

通过文档说明与比较发现,用户权限的不同仅来源于某些数据表中某些字段的不同设置。

3,使用authenticate对所有用户进行认证

>>> from django.contrib.auth import authenticate
>>> user = authenticate(username='jack', password='jackpassword')
>>> user
<MyUser: jack>
>>> user = authenticate(username='jack', password='jack')
>>> user //认证失败,用户不存在,因为密码不对。
>>> user = authenticate(username='admin', password='admin')
>>> user
<MyUser: admin>

二,模型的默认权限

django提供了一个简单的权限系统。它提供了一种将权限分配给特定用户和用户组的方法。具体由admin后台进行管理。

1,在后台查看权限信息

使用超级用户登录admin,进入超级用户信息界面,查看权限:

上图最后四行,分为三列,其中:

2,默认权限

以上的增删改查(add、delete、change、view)都是默认权限。

只要在settings.py中配置了’django.contrib.auth’,它就确保为Django中的每个用户模型创建这几个默认权限,这是在每次执行完migrate后实现的。

打开auth_permission表,内容如下,显示了用户能拥有的权限。

3,判断用户是否有某项权限

>>> user = authenticate(username='admin', password='admin')
>>> user
<MyUser: admin>
>>> user.has_perm('user.delete_myuser')
True
>>> user.has_perm('user.change_myuser')
True
>>> user.has_perm('user.add_myuser')
True
>>> user.has_perm('user.view_myuser')
True
>>> user = authenticate(username='jack', password='jackpassword')
>>> user
<MyUser: jack>
>>> user.has_perm('user.view_myuser')
False
>>> user.has_perm('user.add_myuser')
False
>>> user.has_perm('user.change_myuser')
False
>>> user.has_perm('user.delete_myuser')
False

可知,超级用户在创建后默认就具有所有权限,只有普通用户才需要设置某些权限。

三,django中用户与权限间的联系方式

1,与用户及权限有关的数据表

当执行数据迁移后,项目的数据库中会出现如下几张表:

具体说明:

2,由多对多的数据关系体现

django通过在表与权限表之间建立多对多的数据关系实现用户分组及权限设置。

明确了上述关系后就能设置用户、用户组及权限了。

四,为普通用户设置权限

1,为普通用户添加权限

>>> from user.models import MyUser
>>> user = authenticate(username='jack', password='jackpassword')
>>> user
<MyUser: jack>
>>> user.has_perm('user.view_MyUser')
False //这里没有权限是因为大小写拼写错误,具体权限的名称拼写要按照权限表中codename来。
>>> user.has_perm('user.view_myuser')
False
>>> from django.contrib.auth.models import Permission
>>> ad = Permission.objects.filter(codename='delete_MyUser')[0]
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "F:\PythonProjects\web\django-yingyongkaifashizhan\SOURCE\djangoProject\venv\lib\site-packages\dja
ngo\db\models\query.py", line 309, in __getitem__
    return qs._result_cache[0]
IndexError: list index out of range //同样是因为大小写拼写错误
>>> vi = Permission.objects.filter(codename='view_myuser')[0]
>>> vi
<Permission: user | user | Can view user>
>>> user.user_permissions.add(vi)
>>> user.has_perm('user.view_myuser')
True

首先回顾一下用户表中用户id 和 设置用户权限表中的content_type_id以及codename:

再打开用户权限表,再次确认用户是否拥有该权限:

确实拥有了id=24的view_myuser权限。还拥有两个其他权限,再次验证一下:

>>> user.has_perm('user.delete_myuser')
True
>>> user.has_perm('user.add_myuser')
True
>>> user.has_perm('user.change_myuser')
False

2,为普通用户删除权限

>>> vi = Permission.objects.filter(codename='view_myuser')[0]
>>> user.user_permissions.remove(vi)
//表中该数据已删除
#删除所有权限:
>>> from django.contrib.auth import authenticate
>>> user = authenticate(username='jack', password='jackpassword')
>>> user
<MyUser: jack>
>>> user.has_perm('user.view_myuser')
False
//表中该用户所有数据已删除
>>> user.user_permissions.values()
<QuerySet []>

五,自定义模型默认权限

在实际开发中,每个模型所拥有的默认权限应该是不同的。这可以在定义模型时设置Meta来实现。

class Meta(AbstractUser.Meta):
    permissions = (
        ('vip_user', 'Can do vip options'),
    )

这个模型默认拥有的权限就增加了:

六,用户组

根据前面的知识可以知道,设置用户组及权限的过程其实有两步:

1,创建用户组并赋予权限

1,在auth_group表中添加一条name值为“用户管理”的数据,就创建了一个用户组记录:

2,按照类似于给普通用户设置权限的方法设置用户组权限:

>>> from django.contrib.auth.models import Group, Permission
>>> vip = Permission.objects.filter(codename='vip_myuser')
>>> vip = Permission.objects.filter(codename='vip_myuser')[0]
>>> vip
<Permission: user | user | Can vip user>
>>> group.permissions.add(vip)

更多用户组权限操作:

查看权限:
>>> group.permissions.values()
<QuerySet [{'id': 25, 'name': 'Can vip user', 'content_type_id': 6, 'codename': 'vip_myuser'}]>
删除权限:
>>> group.permissions.remove(perm)
清空权限:
>>> group.permissions.clear()

2,向用户组中添加用户

>>> from django.contrib.auth.models import Group
>>> from user.models import MyUser
>>> user = MyUser.objects.get(username='xiaolu')
>>> group = Group.objects.get(id=1)
>>> user.groups.add(group)

更多用户组操作:

查看用户所在组:
>>> user.groups.values()
<QuerySet [{'id': 1, 'name': '用户管理'}]>
从组中删除某用户:
>>> user.groups.remove(group)
删除组中所有用户:
>>> user.groups.clear()

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文