首先要明确的是,Django的身份验证框架中只存在一个用户类,也就是说,“超级用户”或“普通用户”只是设置了特殊属性的用户对象,而不是用户对象的不同类别。
打开数据库中的用户表user_myuser,is_superuser、is_staff和is_active都被置为1。如下图:
>>> 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。如下图:
通过文档说明与比较发现,用户权限的不同仅来源于某些数据表中某些字段的不同设置。
>>> 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,进入超级用户信息界面,查看权限:
上图最后四行,分为三列,其中:
以上的增删改查(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
可知,超级用户在创建后默认就具有所有权限,只有普通用户才需要设置某些权限。
当执行数据迁移后,项目的数据库中会出现如下几张表:
具体说明:
django通过在表与权限表之间建立多对多的数据关系实现用户分组及权限设置。
明确了上述关系后就能设置用户、用户组及权限了。
>>> 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 "" , 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()