在这篇文章中,我们进行最后关于DjangoPermission系统的探讨,来谈谈关于Permission系统后台接口和扩展后台接口的开发。

Django实现的这套permission体系,在底层被抽象为authentication backends。Django auth backends的默认的内置的实现,就是我们前4篇blog所描述的,基于三个数据库模型User,Permission,Group。在实际开发中,很有可能我们的用户标示或者是密码并非存在于User表中,比如说存放在LDAP中,再比如使用第三方的OAuth。这就需要我们能够对已有的权限系统进行扩展,而不是局限于基于数据库表的权限控制,这也是Django将其抽象为可以定制的authentication backends的缘由。

Django中,所有的authentication backends,可以通过配置settings中的一个变量AUTHENTICATION_BACKENDS来做到,这个变量的类型是元组(Tuple),默认Django的设置是:

AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)

Backend可以是普通的python类,但是关于登陆校验需要具有以下规定的2个方法:

  1. authenticate(self,username=None,password=None) 或者authenticate(self,token=None),如果通过验证,返回值是一个User对象,如果不通过验证,返回值是None。
  2. get_user(self,user_id)

关于许可,需要有以下几个方法:

  1. get_group_permissions
  2. get_all_permissions
  3. has_perm
  4. has_module_perms

这两类方法的具体使用不是很相同,关于登陆校验的authenticate,Django在使用他们的时候,会遍历所有的auth backends,一旦发现有一个backend校验通过,即返回User对象,那么将会停止下面backend的校验,并且将校验成功的backend绑定在该用户上放入session中,此后如果再次调用该方法,那么将会使用session中的backend进行校验,而不再遍历所有backend了。

而关于许可,一个用户所拥有的perm是所有backends所返回的perm。

最后,我们要提醒一下,虽然has_perm的最后一个参数是一个obj,看上去像是支持每个对象级别的权限校验,而事实上,Django只是在架构和接口上面支持了对象级别的权限校验,但是并没有实现。这意味着,所有关于对象权限的校验方法返回值都是False或者是空列表。因此,如果需要实现Object级别的权限控制,需要自己写或者使用第三方扩展来实现。具体点就是将会接受obj和user_obj,对于每一个auth方法会返回一个关于该用户针对于该对象的一个权限控制结果。

总结

以上的5篇文章,详细阐述说明了Django的简洁而强大的权限认证系统,结合django admin site,我们可以很容易的进行权限的定义,分配,使用。

通过User,Permission,Group这三个模型,和Django的Authentication backends。实现了这套Django的简洁版本权限认证。并且通过TemplateProcessor和RequestContext在模版系统中有着方便的使用,让我们可以在界面中通过权限来控制提供给某个用户的显示。

但是,美中不足的是Django并没有实现对象级别的权限控制。比方说在论坛系统中,只有管理员和帖子的发布者才有对该帖子对象的修改权限,这就是对象级别而非模型级别的权限控制。因此,我们需要自己实现对象级别的权限控制。依靠我们对django核心auth系统的掌握,我们可以很容易的开发或者引用第三方提供的Object level auth。具体关注接下来的博文。

 

django(权限、认证)系统—— 基于Authentication backends定制的更多相关文章

  1. django用户认证系统——拓展 User 模型

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  2. Django之认证系统

    Django之认证系统 cookie和session 1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞 ...

  3. django用户认证系统——拓展 User 模型2

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  4. django用户认证系统——基本设置1

    网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整的.灵活的.易于拓展的用户认证系统:django.contrib.auth.在本教程中,我将向你展示 auth ...

  5. Django的认证系统—auth模块

    Django的认证系统 auth模块的知识点总结: 1. 创建超级用户 python manage.py createsuperuser from django.contrib import auth ...

  6. django用户认证系统——重置密码7

    当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...

  7. “Django用户认证系统”学习资料收集

    首推追梦人物——Django用户认证系统 待续……

  8. django用户认证系统——修改密码6

    再此之前我们已经完成了用户登录.注册.注销等功能,接下来让我们继续为用户提供修改密码的功能.该功能 Django 的 auth 应用也已经为我们提供,过程几乎和之前的登录功能完全一样. 编写修改密码模 ...

  9. Django用户认证系统(二)Web请求中的认证

    在每个Web请求中都提供一个 request.user 属性来表示当前用户.如果当前用户未登录,则该属性为AnonymousUser的一个实例,反之,则是一个User实例. 你可以通过is_authe ...

随机推荐

  1. Https背景与证书在spring boot项目中的使用

    https背景(本人学习参考中觉得不错的几篇文章) https如何解决安全问题 HTTPS 理论基础及其在 Android 中的最佳实践 什么是https 关于https的个人总结 总所周知http是 ...

  2. python3 数据科学基础

    第一章 1.Anaconda(最著名的python数据科学平台) 下面小伙伴们咱们来初初识下Anaconda吧 What is Anaconda???? 回答: (1).科学计算的平台 (2).有很多 ...

  3. Day2_and_Day3 文件操作

    文件修改操作: 文件的修改操作:文件并没有修改操作,实际是将一个编写的新文件覆盖了原有的文件 替换文件中的某个内容: with open('old.txt','r',encoding='utf-8') ...

  4. Top Open Source Projects to Watch in 2017

    https://opensource.com/article/16/12/yearbook-projects-watch-2017 No one has a crystal ball to see t ...

  5. 在Django中使用Neo4j

    重要的先说在前面吧,最后的选型结构是安装了最新的neo4j版本3.0.3,使用了neo4j-rest-client客户端库.主要原因是更适用于django的neomodel库目前只支持neo4j2.2 ...

  6. ubuntu 13.10 install wireshark

    ubuntu 13.10 install wireshark 今天在使用java jsoup操作remote server的是否,在本地执行可以成功返回内容,然后打成jar包,使用shell在 ser ...

  7. id为194024的进程当前未运行

    .NET MVC 编译运行时 提示  >> id为194024的进程当前未运行 << 清理解决方案,重新运行

  8. jdk的配置

    在新建页面系统变量,输入变量名"JAVA_HOME":变量值"你的jdk的路径 在系统变量区域,选择"新建",输入变量名"CLASSPATH ...

  9. android解析xml文件方法之一-----DOM

    Hello.xml文件 <dict num="219" id="219" name="219"> <key>hell ...

  10. MyBatis打印SQL执行时间

    1.plugins MyBatis官网对于plugins的描述是这样的: MyBatis allows you to intercept calls to at certain points with ...