Django权限讲的比较好的一个网址 : http://www.jianshu.com/p/01126437e8a4
系统中做权限的划分:
老师,学生
权限是针对于某一个model设定的
当添加一个model的时候就会有对应权限关联上
默认的权限有add,change,delete
is_active is_staff is_superuser为用户的权限
is_staff是否可以登录后台
用户权限模块:Users,Permissions,Groups(他们之间互相多对多的关联)
每个model默认的权限:add,change,,delete
表结构:
auth_group ->分组信息表
auth_group_permissions ->分组和权限的关联表
auth_permission ->权限信息表
user_aoo_userprofile ->用户信息表
user_app_userprofile_groups ->用户和分组的关联表
user_app_userprofile_user_permissions ->用户和权限的关联表
在Permissionmixin提供管理权限的API
用navicate工具分析数据模型之间的关系,可以画,也可以直接导入
如果用户数据某个组(组分了一些权限),而且管理页面也给用户赋予一些权限了,就是单独给的权限,那么用户的实际权限是 用户权限+组权限
权限 分组 用户 是一个多对多的关系,需要研究它们是怎么关联上的
三:权限的设计使用
2.1 Permission
如上文所述,Django定义每个model后,默认都会添加该model的add, change和delete三个permission,自定义的permission可以在我们定义model时手动添加:
1
2
3
4
5
6
7
8
|
class Task(models.Model): ... class Meta: permissions = ( ( "view_task" , "Can see available tasks" ), ( "change_task_status" , "Can change the status of tasks" ), ( "close_task" , "Can remove a task by setting its status as closed" ), ) |
每个permission都是django.contrib.auth.Permission类型的实例,该类型包含三个字段name,codename和content_type,其中content_type反应了permission属于哪个model,codename如上面的view_task,代码逻辑中检查权限时要用,name是permission的描述,将permission打印到屏幕或页面时默认显示的就是name
2.2 User Permission管理
User对象的user_permission字段管理用户的权限:
1
2
3
4
5
6
7
8
|
myuser.user_permissions = [permission_list] myuser.user_permissions.add(permission, permission, ...) #增加权限 myuser.user_permissions.remove(permission, permission, ...) #删除权限 myuser.user_permissions.clear() #清空权限 ############################################################## # 注:上面的permission为django.contrib.auth.Permission类型的实例 ############################################################## |
检查用户权限用has_perm()方法:
myuser.has_perm('myapp.fix_car')
has_perm()方法的参数,即permission的codename,但传递参数时需要加上model 所属app的前缀,格式为<app label>.<permission codename>。
无论permission赋予user还是group,has_perm()方法均适用
第一设置权限,第二注册权限