在这篇文章中,我们进行最后关于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. obj-c编程08:分类和协议

    篇文章里我们来聊聊如何扩展一个类的方法和实例变量,我们首先来看一下命名分类如何扩展一个类.在下面的代码中,首先定义一个类Player用来定义普通球员,如果第三方开发者发现普通球员缺少了一些方法,则可以 ...

  2. 恶补web之一:html学习(2)

    iframe用于在网页内显示网页:<iframe src="URL"></iframe>,iframe可用作链接的目标: <!DOCTYPE html ...

  3. C语言有哪些鲜为人知的特性?

    译注:本文摘编自 Quora 的一个热门问答贴. 请在linux系统下测试本文中出现的代码 Andrew Weimholt 的回复: switch语句中的case 关键词可以放在if-else或者是循 ...

  4. 十六进制颜色转换为iOS可以用的UIColor

    // //  UIColor+Transformation.h //  ContactApp // //  Created by 袁冬冬 on 15/9/11. //  Copyright (c) 2 ...

  5. IT咨询顾问:一次吐血的项目救火

    年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登录,对方技术人员一头雾水不知道什么原因 ...

  6. 转发 JBPM工作流小结

    JBoss 题记:某部门领导有天突发奇想,把我们几个人叫过去,曰:最近出去开会,老有人推销自己的工作流产品,说的这好那好,你们几个给我研究研究.正好刚做完的xxx子系统里有一个申请审批的流程,你们按这 ...

  7. 详解Lambda

    定义好委托: public delegate int FirDelegate(int a); public delegate int SecDelegate(int a,int b); public ...

  8. Ocelot中文文档-授权

    Ocelot支持基于声明的授权. 这意味着如果您有要授权的路由,您可以将以下内容添加到您的ReRoute配置中. "RouteClaimsRequirement": { " ...

  9. 浅谈面试中的OOD面向对象设计问题

    转载自:http://baozitraining.org/blog/Object-oriented-design-question/ OO设计问题是电面或者onsite中常考的问题,尤其对以Java为 ...

  10. python2.7 的中文编码处理,解决UnicodeEncodeError: 'ascii' codec can't encode character 问题

    最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...