Django默认权限机制介绍及实践
演示Django版本为当前最新版本v2.2
当Django配置文件中的INSTALL_APPS
包含了django.contrib.auth
时,就默认启用了一个简单的权限系统,提供了为用户或组分配权限的方法
之所以说简单呢?主要是因为:
- 默认的权限系统是基于表的控制,权限最小粒度是表
也就是说,假如有一个Blog表,我们可以赋予用户或组对Blog表有delete的权限,那么用户或组成员就可以删除全部Blog,是不能控制用户只能删除自己创建的blog的
如果希望用户只能删除自己创建的Blog,不能删除别人创建的Blog,这种需求Django默认的权限管理就无法实现了,需要用到object permission
对象权限,有第三方模块实现了对象权限,如django-guardian,你可以直接使用,或者也可以自己实现对象权限,具体思路可参考这篇文章:Django内置权限扩展案例
- 每个Model模型默认只有四个权限,分别是添加
add_
、修改change_
、删除delete_
、查看view_
,这些权限记录在Permission表中,表数据如下:
默认权限的创建是通过Django的信号signals实现的,使用了post_migrate
信号,在每次执行migrate操作时都会为新的Model模型创建默认权限,关于Django的信号Signals介绍和使用可以查看这篇文章:
当然你也可以在程序中来添加或修改权限
用户权限修改方法:
ops = User.objects.get(id=2) ops.user_permissions.add(25, 26) ops.user_permissions.set([26, 27]) ops.user_permissions.remove(26, 27) ops.user_permissions.clear()
组权限修改方法:
coffee = Group.objects.get(id=1) coffee.permissions.add(25) coffee.permissions.set([26,27]) coffee.permissions.remove(25) coffee.permissions.clear()
其中add
为添加,set
为设置,remove
为移除,clear
为清空,add
跟set
的区别是add
会在原有权限的基础上加新权限,而set
会清空原有权限设置成新的权限,后边的参数25,26,27可以为Permission的ID或者是Permission对象,例如这样也是可以的:
p = Permission.objects.get(id=25) coffee.permissions.add(p)
给组赋予权限,组内的所有用户会自动的拥有该组的权限,例如用户