Django权限使用总结

概述

Django自带有用户验证系统,它能够处理User、Group、permission以及基于用户cookie的session。这个文档是基于Django官网文档的介绍,以及其余的资料整理而来。主要的内容介绍了Django的用户验证系统的基本工做原理,而且也会对于如何为你的项目定制用户验证作出简单介绍。django

Permission在Django中的工做原理

首先,咱们须要定义permission对象,而这个对象在定义的时候是须要与对应的model绑定的。
而后,定义好的permission就能够赋予给user或者group对象,实现permission与用户的绑定。
最后,在view以及template中能够经过API对于user或者group进行权限的校验了。cookie

权限的定义

permission可使用多种方式进行定义:session

在model中定义

咱们能够在model的Meta中对permission进行定义。
官网示例以下:app

clipboard.png

单独定义

或者能够在独立于model以外的位置定义。
官网示例以下:google

clipboard.png

不绑定特定的model定义

以上的两个例子都是须要咱们已经具备model的状况下才能定义permission,若是咱们尚未model的状况下,又想要定义permission的话,应该怎么处理呢?虽然这个需求有点奇怪
引用至GoogleGroup一个不存在的页面url

url_content_type = ContentType.objects.create(
    name='url permission', app_label='crashstats', model='unused')

can_view_url = Permission.objects.create(
    name='can view url', content_type=url_content_type,
    codename='can_view_url')

user = User.objects.get(username='example_user', is_superuser=False)
user.user_permissions.add(can_view_url)

这样经过绑定到一个不存在的model来实现也是支持的。实际使用中发如今定义ContentType的时候,给model赋值空字符串也是可行的,可是None则不行。spa

一个更为通用的解决方案3d

这样就会获得咱们所定义的permission对象了。并且Django会为每一个permission赋予一个全局惟一的code,规则:<app_label>.<permission_codename>。经过这个code就能够指定相应的permissioncode

权限的授予

权限的授予能够经过user或者group来进行。
user经过user_permissions属性设置permission,group经过permissions属性设置permission。对象

官网示例以下:

clipboard.png

权限的校验

在view中校验权限

利用decorator校验

官网示例以下:

clipboard.png

注意:permissions除了用string指定单个权限以外,还支持list以及tuple用于多个权限。

利用Mixin校验

官网示例以下:

clipboard.png

在template中校验权限

若是在Django的settings里面设置了django.contrib.auth.context_processors.auth,以及启用了RequestContext的话,那Django就会默认在template中传递两个变量:

  • {{ user }}

  • {{ perms }}

其中的{{ perms }}变量就能够实如今template使用permission,从而达到经过不一样的permission提供不一样的template的功能。

实际上Django在template当中对于permission的使用提供了两个API的功能,一个是User.has_module_perms;另外一个是User.has_perm。
当你在template中使用{{ perms.foo }}的时候就会调用User.has_module_perms方法,若是用户具备foo这个permission的话,这个值就会为True。
当你在template中使用{{ perms.foo.can_vote }}的时候就会调用User.has_perm方法,若是用户具备foo.can_vote这个permission的话,这个值就会为True。

permission在template中的使用示例:

clipboard.png
clipboard.png

参考文档

官网认证系统文档
官网ContentType文档
官网自定义校验文档

相关文章
相关标签/搜索