资讯专栏INFORMATION COLUMN

Django权限使用总结

JellyBool / 2727人阅读

摘要:权限的定义可以使用多种方式进行定义在中定义我们可以在的中对进行定义。官网示例如下权限的校验在中校验权限利用校验官网示例如下注意除了用指定单个权限之外,还支持以及用于多个权限。实际上在当中对于的使用提供了两个的功能,一个是另一个是。

概述

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

Permission在Django中的工作原理

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

权限的定义

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

在model中定义

我们可以在model的Meta中对permission进行定义。
官网示例如下:

多带带定义

或者可以在独立于model之外的位置定义。
官网示例如下:

不绑定特定的model定义

以上的两个例子都是需要我们已经具有model的情况下才能定义permission,如果我们还没有model的情况下,又想要定义permission的话,应该怎么处理呢?虽然这个需求有点奇怪
引用至GoogleGroup一个不存在的页面:

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则不行。

一个更为通用的解决方案

这样就会得到我们所定义的permission对象了。而且Django会为每个permission赋予一个全局唯一的code,规则:.。通过这个code就可以指定相应的permission

权限的授予

权限的授予可以通过user或者group来进行。
user通过user_permissions属性设置permission,group通过permissions属性设置permission。

官网示例如下:

权限的校验 在view中校验权限 利用decorator校验

官网示例如下:

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

利用Mixin校验

官网示例如下:

在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中的使用示例:


参考文档

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38205.html

相关文章

  • 关于WEB前后端分离的要点总结(上)

    摘要:前言对于前后端分离大家可能在网上可以找到很多的文章。但是,我们今天分享的文章的英文我们的老师对于前后端的分离问题的多年工作经验的总结。今天,我们把这些经验总结知识点分享给大家,希望可以帮助到大家。添加开启黑白名单,任选其一。 前言 对于前后端分离大家可能在网上可以找到很多的文章。但是,我们今天分享的文章的英文我们的老师对于前后端的分离问题的多年工作经验的总结。今天,我们把这些经验总结知...

    FullStackDeveloper 评论0 收藏0
  • 解决Python虚拟环境virtualenv下不能使用sudo提升权限问题

    摘要:解决虚拟环境下不能使用提升权限问题问题描述在虚拟环境下,执行某些命令需要有提升权限,会导致该条命令退出虚拟环境如启动服务,需要监听端口此时会提示权限不足,无法访问端口。  解决Python虚拟环境下不能使用sudo提升权限问题 问题描述 在虚拟环境下,执行某些命令需要有sudo提升权限,会导致该条命令退出虚拟环境: 如启动django 服务,需要监听80端口: $: python ma...

    Lucky_Boy 评论0 收藏0
  • Django REST FrameWork中文教程4:验证和权限

    摘要:未经身份验证的请求应具有完全只读访问权限。其中一个字段将用于表示创建代码段的用户。唯一的限制是所包含的必须使用命名空间。中文教程序列化中文教程请求和响应中文教程基于类的视图中文教程验证和权限中文教程关系和超链接中文教程中文教程模式和客户端库 目前,我们的API对谁可以编辑或删除代码段没有任何限制。我们想要一些更高级的行为,以确保: 代码段始终与创建者相关联。 只有身份验证的用户可以创建...

    luodongseu 评论0 收藏0
  • Django REST FrameWork中文教程4:验证和权限

    摘要:未经身份验证的请求应具有完全只读访问权限。其中一个字段将用于表示创建代码段的用户。唯一的限制是所包含的必须使用命名空间。中文教程序列化中文教程请求和响应中文教程基于类的视图中文教程验证和权限中文教程关系和超链接中文教程中文教程模式和客户端库 目前,我们的API对谁可以编辑或删除代码段没有任何限制。我们想要一些更高级的行为,以确保: 代码段始终与创建者相关联。 只有身份验证的用户可以创建...

    _ang 评论0 收藏0
  • Django REST FrameWork中文教程4:验证和权限

    摘要:未经身份验证的请求应具有完全只读访问权限。其中一个字段将用于表示创建代码段的用户。唯一的限制是所包含的必须使用命名空间。中文教程序列化中文教程请求和响应中文教程基于类的视图中文教程验证和权限中文教程关系和超链接中文教程中文教程模式和客户端库 目前,我们的API对谁可以编辑或删除代码段没有任何限制。我们想要一些更高级的行为,以确保: 代码段始终与创建者相关联。 只有身份验证的用户可以创建...

    Hydrogen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<