文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-05-12 14:50

关注

一,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()

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯