在写django代码时,如果要防止某些敏感数据被看,被修改等,我们一般对其增加权限。
在代码中如是写道:@permission_required("auth.add_permission",login_url='/login/', raise_exception=True)
@login_required
# 第一个参数是:'model.per_name'
# 第二个参数是:如果用户没登录则转向这个网址
# 第三个参数是:如果没有此权限则返回403错误
那再数据库中是如何管理权限的呢?有6张表管理权限,1张表管理app
首先,分析代码中的第一个参数:model.per_name
model在哪?在django_content_type表中。
可以看到,每一个model对应一个id,体现在代码中的是app_label。
per_name在哪?在auth_permission表中。
可以看到,每一个权限对应于一个model,也对应一个id。其中,content_type_id就是django_content_type表中model的id。体现在代码中的是codename。
所以,在代码@permission_required("auth.add_permission")中,权限管理模块首先会去查django_content_type表中app_label列是“auth”对应的id,拿到这个id后,去auth_permission表中content_type_id列找出匹配这个id的那些条目,在这些条目中再匹配codename为“add_permission”的条目,最后在这张表中匹配出一个条目,体现在这张表(auth_permission)中的id上。
为了方便管理,我们把一些权限放到一个组里,再看auth_group表中有哪些权限组:
可以看到,每一个权限组对应一个id,每一个权限组包含若干权限。
如何查看一个组对应有哪些权限?在auth_group_permissions表中:
可以看到,group_id=3的组拥有25到36的权限。这些权限都是在auth_permission表中定义。
哪些人拥有这个权限组的权限?在auth_user_groups表中。
可以看到,拥有group_id=3这个组里的权限的人user_id是1,7,11。
那user_id是1,7,11的人是谁?看auth_user这张表:
可以看出,虽然没有id=1的人(或许删了),但可以看出id=7,11的人是谁。
以上是把一些权限放到一个组里,是否可以一个用户对应一个权限呢?可以,在auth_user_user_permissions表中。
可以看到,一个用户(uer_id)对应一个权限(permission_id)。
限管理的几个内建方法
用户权限
youUserObejct.permisstions = [permisstionObj,permisstionObj] ##增加用户的权限
youUserObejct.permisstions.add(permisstionObj) ## 增加用户的权限
youUserObejct.permisstions.remove(user_permisstionsObj) ##删除用户的权限
youUserObejct.permisstions.clear() ##删除用户的所有权限
youUserObejct.get_all_permisstions(obj_None) ##得到用户的所有权限
用户分组
youUserObejct.groups = [groupObj,groupObj] ##增加分组
youUserObejct.groups.add(groupObj) ##增加分组
youUserObejct.groups.remove(groupObj) ##删除分组
youUserObejct.groups.clear() #删除用户所有分组
组权限
goupObj.permisstions = [permisstionObj,permisstionObj]
goupObj.permisstions.add(permisstionObj)
goupObj.permisstions.remove(permisstionObj)
goupObj.permisstions.clear()
权限验证
youUserObejct.has_perm(perm,obj=None) #检查用户是具有某项权限
youUserObejct.has_perms(perm,obj=None) #检查用户是具有多项权限
youUserObejct.get_group_permisstions(obj_None) ##返回用户组所有权限
密码控制
youUserObejct.check_password(raw_password) #检查密码是否正确
youUserObejct.set_password(raw_password)#重设密码