django之用户、用户组及权限设置方式(django 用户权限)干货分享

随心笔谈4个月前发布 admin
204 00
🌐 经济型:买域名、轻量云服务器、用途:游戏 网站等 《腾讯云》特点:特价机便宜 适合初学者用 点我优惠购买
🚀 拓展型:买域名、轻量云服务器、用途:游戏 网站等 《阿里云》特点:中档服务器便宜 域名备案事多 点我优惠购买
🛡️ 稳定型:买域名、轻量云服务器、用途:游戏 网站等 《西部数码》 特点:比上两家略贵但是稳定性超好事也少 点我优惠购买

文章摘要

这篇文章主要介绍了Django中关于用户身份验证和权限管理的核心内容,重点阐述了以下关键点: 1. **超级用户与普通用户的区别** - 超级用户(`superuser`)在`superuser`表中,通过`is_superuser`、`is_staff`和`is_active`字段设置特殊权限,而普通用户仅在`is_active`字段设置为`True`,并不构成不同的用户类别。 2. **用户表与权限表的结构** - Django通过数据库表实现了用户与权限的关系: - `user_myuser`:用户表,存储用户的基本信息。 - `auth_permission`:权限表,存储用户是否具有某种权限的信息。 - `user_myuser_groups`:用户组表,存储用户所属的组信息。 - 通过`user_myuser_user_permissions`和`user_myuser_groups`等表实现了用户、用户组与权限之间的多对多关系。 3. **权限的验证与管理** - 使用`authenticate`方法验证用户身份。 - 默认权限通过`django.contrib.auth`配置,普通用户仅获取默认权限。 - 继承或自定义`user`模型时,`Meta`类可自定义默认权限。 4. **用户组的管理** - 用户组通过`auth_group`表管理,用户组与权限之间通过`auth_group_permissions`表关联。 - 用户加入用户组后,自动获得该组的所有权限。 5. **自定义权限与用户组** - 可通过`Meta`类在自定义模型中设置默认权限。 - 用户组权限管理: - 添加用户到用户组:`user.groups.add(group)` - 删除用户组中的用户:`user.groups.clear()` - 添加或删除用户组权限:通过`group.permissions`表操作。 总结:这篇文章详细介绍了Django中用户身份验证与权限管理的核心机制,包括超级用户与普通用户的区别、用户表与权限表的结构、权限的验证与管理方法,以及用户组的创建与权限分配流程。这些内容为开发者提供了全面的参考,帮助他们在实际开发中实现用户分组与权限控制。



目录一,django中超级用户与普通用户的本质区别1,当使用命令python manage.py createsuperuser后2,使用命令创建普通用户后3,使用authenticate对所有用户进行认证二,模型的默认权限1,在后台查看权限信息2,默认权限3,判断用户是否有某项权限三,django中用户与权限间的联系方式1,与用户及权限有关的数据表2,由多对多的数据关系体现四,为普通用户设置权限1,为普通用户添加权限2,为普通用户删除权限五,自定义模型默认权限六,用户组1,创建用户组并赋予权限2,向用户组中添加用户总结

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

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

如下图:

is_superuser:Boolean. Designates that this user has all permissions without explicitly assigning them.指定此用户拥有所有权限,但不显式分配这些权限。is_staff:Boolean. Designates whether this user can access the admin site.指定此用户是否可以访问管理站点。is_active:Boolean. Designates whether this user account should be considered active. We recommend that you set this flag to False instead of deleting accounts; that way, if your applications have any foreign keys to users, the foreign keys won’t break.官方建议删除用户操作由置该位为false实现,避免外键中断。

>>> 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。

如下图:

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

>>> 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后台进行管理。

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

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

user是app名。用户是自定义的模型MyUser。这个模型来自django:对django内置的User模型进行自定义扩展。最后一列是该用户模型新增数据所拥有的具体权限:增删改查。

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

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

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

>>> 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

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

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

具体说明:

user_myuser用户user_myuser_groups用户组user_myuser_user_permissions用户权限auth_permission设置用户权限auth_group设置用户组auth_group_permissions设置用户组权限

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

user_myuser_user_permissions管理user_myuser与auth_permission间的数据对应关系,设置用户权限。user_myuser_groups管理user_myuser与user_myuser_groups间的数据对应关系,设置用户所属组。auth_group_permissions管理user_myuser_groups与auth_permission间的数据对应关系,设置用户所属组的权限。

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

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

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

您可能感兴趣的文章:Django 权限管理(permissions)与用户组(group)详解Django自定义权限及用户分组Django权限设置及验证方式

© 版权声明

相关文章