Django中内置了权限的功能。
- 都是针对表(模型级别)的。比如对某个模型上的数据是否可以进行增删改查操作。
- 不能针对数据级别的,比如对某个表中的某条数据能否进行增删改查操作(如果要实现数据级别的,考虑使用
django-guardian)。
创建完一个模型后,针对这个模型默认就有三种权限,分别是增/删/改。
在执行完migrate命令后,查看数据库中的auth_permission表中的所有权限。
其中的codename表示的是权限的名字。name表示的是这个权限的作用。content_type_id指向django_content_type表,该表示表示models对应的app
添加权限
通过定义模型添加权限
如果想要增加新的权限,比如查看某个模型的权限,那么可以在定义模型的时候在Meta中定义好。
class DemoModel(models.Model):username = models.CharField(max_length=20)password = models.CharField(max_length=20, validators=[validators.MinLengthValidator(6)])class Meta:permissions = {("search_demo", "can search demo"),}
通过代码添加权限
权限都是django.contrib.auth.Permission的实例。
这个模型包含三个字段,name、codename以及content_type,其中的content_type表示这个permission是属于哪个app下的哪个models。
from django.contrib.auth.models import Permission, ContentTypefrom .models import DemoModeldef create_permission(request):content_type = ContentType.objects.get_for_model(DemoModel)permission = Permission.objects.create(codename='edit_demo', name='can edit demo', content_type=content_type)return HttpResponse("create_permission successful")
用户与权限管理
权限本身只是一个数据,必须和用户进行绑定,才能起到作用。User模型和权限之间的管理,可以通过以下几种方式来管理(MyUser指的是默认有的User模型或者是自定义的模型):
MyUser.user_permissions.set(permission_list):直接给定一个权限的列表。MyUser.user_permissions.add(permission,permission,...):一个个添加权限。MyUser.user_permissions.remove(permission,permission,...):一个个删除权限。MyUser.user_permissions.clear():清除权限。MyUser.has_perm('<app_name>.<codename>'):判断是否拥有某个权限。权限参数是一个字符串,格式是app_name.codename。判断user.permissions下有没有这个权限:有, 返回True;没有 判断所属组下有没有这个权限.MyUser.get_all_permissons():获取所有的权限。
def operate_permission(request):content_type = ContentType.objects.get_for_model(DemoModel)permissions = Permission.objects.filter(content_type=content_type)for permission in permissions:print(permission)user = InheritTwo.objects.filter().first()# user.user_permissions.set(permissions)# user.user_permissions.clear()# user.user_permissions.add(permissions[0])# user.user_permissions.add(*permissions)# user.user_permissions.remove(permissions[1])# user.user_permissions.remove(*permissions)if user.has_perm('front.search_demo'): # 如果是user.has_perms,则参数是一个列表print("yes")else:print("no")return HttpResponse("successful")
权限限定装饰器
使用django.contrib.auth.decorators.permission_required可以非常方便的检查用户是否拥有这个权限,
- 如果拥有,那么就可以进入到指定的视图函数中,
- 如果不拥有,那么就会报一个
403错误。
from django.contrib.auth.decorators import permission_required#@permission_required(["front.search_demo",])# @permission_required("front.search_demo") # 默认访问http://127.0.0.1:8000/accounts/login/?next=/search/# @permission_required("front.search_demo", login_url='/login/') #如果验证失败,则跳转login_url指定的url路径@ permission_required("front.search_demo", login_url='/login/', raise_exception=True) # 即使验证成功后,如果没有权限,则跳转403def search_demo(request):# 类似以下操作# if request.user.is_authenticated:# print("已经登陆")# if request.user.has_perm('front.search_demo'):# return HttpResponse("这是查询demo的界面")# else:# return HttpResponse("你没有权限访问该页面的权限")# else:# return redirect(reverse('login'))return HttpResponse("这是查询demo的界面") # 如果验证成功且有权限
