Django源码学习-22-staff_member_required
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
from django.contrib.auth.models import Permission
权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源。
Django Authentication
1、将 'django.contrib.auth' 放在 INSTALLED_APPS 设置中,然后同步生成数据库表。
2、确认 SessionMiddleware 后面的 MIDDLEWARE 设置中包含
'django.contrib.auth.middleware.AuthenticationMiddleware' SessionMiddleware。
User对象
位于'django.contrib.auth.models'模块中有两个多对多的属性分别是groups和user_permissions。
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManage
Django 权限机制
Django 权限机制能够 约束用户行为,控制页面的显示内容 ,也能使 API 更加安全和灵活;用好权限机制,能让系统更加强大和健壮
Django 用 user, group 和 permission 完成了权限机制,这个权限机制是将属于 model 的某个 permission 赋予 user 或 group,可以理解为全局的权限,即如果用户A对数据模型(model)B 有可写权限,那么 A 能修改model B 的所有实例(objects)。group 的权限也是如此,如果为 group C 赋予 model B 的可写权限,则隶于属 group C 的所有用户,都可以修改model B 的所有实例。
Django 用 permission 对象存储权限项,每个model默认都有三个permission,即 add model, change model 和 delete model。
permission 总是与 model 对应的,如果一个 object 不是 model 的实例,无法为它创建/分配权限。
# ---------- Permission 权限 -------------from django.contrib.auth.models Permissionfrom django.contrib.auth import get_user_modelUser = get_user_model()
# 用户权限管理
# 添加用户权限,比如给 'apple' 用户添加可以给hostandgroup表增加记录的权限。u1 = User.objects.get(username='apple')p = Permission.objects.get(id=25)# 该方法接受一个Permission对象为参数,用于给用户添加权限u1.user_permissions.add(p)
# 给用户添加多条权限u1.user_permissions.add(p,p2,p3)
# 查看用户的所有权限u1.get_all_permissions()Out[8]: {u'ops01.add_hostandgroup'}
# 验证用户权限(用于校验用户是否有该权限,有返回True,没有返回 False)u1.has_perm('ops01.add_hostandgroup')
# 验证用户的权限列表,接收一个列表为参数,如果用户拥有该列表中的所有权限则返回True 否则返回Falsealist = []alist.append('ops01.add_hostandgroup')alist.append('ops01.change_hostandgroup')alist.append('ops01.delete_hostandgroup')u1.has_perms(alist)
# 删除用户权限u1.user_permissions.remove(p)
# 组权限管理
# 添加组权限g = Group.objects.get(id=1)p = Permission.objects.get(id=25)g.permissions.add(p)
# 添加多条组权限g.permissions.add(p1,p2)
# 给该组设置一个权限列表p = Permission.objects.get(id=25)p1 = Permission.objects.get(id=26)p2 = Permission.objects.get(id=27)
plist = []plist.append(p)plist.append(p1)plist.append(p2)
g.permissions = plist
# 删除组权限g.permissions.remove(p)
# 删除多条组权限g.permissions.remove(p1,p2)
# 清空组权限g.permissions.clear()
# 查看组的所有权限g.permissions.all()Out[42]: [<Permission: ops01 | user | Can add user>, <Permission: ops01 | user | Can change user>]