django:用户、用户组及权限设置

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

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

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

打开数据库中的用户表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实现,避免外键中断。

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,与用户及权限有关的数据表

当执行数据迁移后,项目的数据库中会出现如下几张表:
在这里插入图片描述
具体说明:

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

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

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

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

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

四,为普通用户设置权限

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. 设置用户组权限。
  2. 设置用户的组归属。

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()
  • 12
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Django 提供了一个强大的权限系统,可以帮助你管理用户权限。在 Django 中,你可以使用内置的 User 和 Group 模型来管理用户用户组。 首先,你需要在你的 Django 项目中启用权限系统。在你的 settings.py 文件中,确保 'django.contrib.auth' 和 'django.contrib.contenttypes' 应用被添加到了 INSTALLED_APPS 列表中。 接下来,你可以使用 Django 的认证系统来处理用户认证和授权的任务。你可以使用以下方法来检查用户权限: 1. `user.has_perm(permission, obj=None)` - 检查用户是否有指定的权限。`permission` 参数是一个字符串,表示权限的名称。`obj` 参数是可选的,用于在特定对象上检查权限。 2. `user.has_perms(permissions, obj=None)` - 检查用户是否拥有所有指定的权限。`permissions` 参数是一个字符串列表,表示多个权限的名称。 3. `user.has_module_perms(app_label)` - 检查用户是否对指定应用程序拥有任何权限。`app_label` 参数是应用程序的名称。 此外,你还可以使用装饰器 `@permission_required` 和 `@login_required` 来限制对视图函数的访问权限。`@permission_required` 装饰器可以确保只有具有特定权限用户才能访问被装饰的视图函数,而 `@login_required` 装饰器可以确保只有已登录的用户才能访问被装饰的视图函数。 当然,你也可以自定义权限,通过在 models.py 中创建 Permission 对象,并在 User 或 Group 对象上分配这些自定义权限。 要了解更多关于 Django用户权限管理的信息,可以参考 Django 官方文档中的相关章节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值