zoukankan      html  css  js  c++  java
  • django(权限、认证)系统—— 基于Authentication backends定制

    在这篇文章中,我们进行最后关于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。具体关注接下来的博文。

     
  • 相关阅读:
    iOS YSKit系列
    Xcode $(SRCROOT)和$(PROJECT_DIR)区别
    gcc -ldl 选项作用
    rpm 命令
    ls 命令详解
    Linux下用户组、文件权限详解
    服务不支持chkconfig的解决
    Linux 安装 MongoDB数据库
    CentOS 7 之前好好的,突然一天启动时黑屏,没有登陆界面了(配置 network-scripts 连网)
    vi 命令集
  • 原文地址:https://www.cnblogs.com/wangwei916797941/p/7398976.html
Copyright © 2011-2022 走看看