一,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\', \'[email protected]\', \'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,进入超级用户信息界面,查看权限:
上图最后四行,分为三列,其中:
- user是app名。
- 用户是自定义的模型MyUser。这个模型来自django:对django内置的User模型进行自定义扩展。
- 最后一列是该用户模型新增数据所拥有的具体权限:增删改查。
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通过在表与权限表之间建立多对多的数据关系实现用户分组及权限设置。
- user_myuser_user_permissions管理user_myuser与auth_permission间的数据对应关系,设置用户权限。
- user_myuser_groups管理user_myuser与user_myuser_groups间的数据对应关系,设置用户所属组。
- 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\\django\\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()