五一在家,VPN不能链接了,而项目在本地run的过程中,又需要链接公司的SSO server才能login。下雨,不想去公司,又不得不在家做task,只能想办法避开SSO login,以前知道django自带的有login模块,就打算用它暂时替换掉项目本身的login模块,这样就能绕过SSO验证,就不用连接到公司的server了。
我接这个项目的时候,login模块就做好了,一直也没出问题,也没去研究过,趁此机会,学习了一下django的用户验证框架。

以前没怎么做过web,开始正儿八经接触web框架就是springMVC,用户验证这块儿也就配过spring-security,初步认识Auth/Auth模块就是user验证,赋予权限,然后再驱动登录创建session。django的User authentication模块也确实涵盖了这些,不过,它的特点是更简单,更灵活。

django的用户验证模块基于django.contrib.auth,auth.models里面有一个User类,User类继承了AbstractBaseUser和PermissionsMixin两个类,AbstractBaseUser提供User的基本属性和相应的get/set方法比如username,password,email。PermissionsMixin提供usr权限相关的方法,可以验证User的权限,赋予User权限等。

auth的__init__.py里面提供了authenticate, login, logout等方法,用于验证和登录、登出。

django提供了几种用户验证方式:user对象验证,web requests对user对象验证,还有基于装饰器的验证方法@login_required,@user_passes_test,@permission_required。用起来比较简单。

当然,除了default的authentication,django也允许使用自定义的authentication backend, 我一直认为是django框架灵活性的最大体现,作为一个全栈的web框架,django更倾向于自己实现所有的模块,很少直接兼容第三方模块,能自定义backend替换default的,算是django框架的一条通往外界之路。

自定义的authentication backend只要实现两个方法:authenticate和get_user,然后在setting.py的AUTHENTICATION_BACKENDS属性里进行一下声明就可以了,auth模块的__init__.py中有个get_backends的方法,会收集所有声明在AUTHENTICATION_BACKENDS中的所有authentication backend对象,在auth.authenticate方法中遍历执行get_backends对象列表的authenticate方法,只要返回的user为真,就直接return出去。

所以,我在项目中避开SSO login的操作就是把AUTHENTICATION_BACKENDS中django的default user authentication模块(django.contrib.auth.backends.ModelBackend),调整到自定义的authentication backend声明之前,然后在成功验证拿到User对象之后,调用django的login,完成session创建和登录跳转,就OK了。

玩儿了一下django User authentication的更多相关文章

  1. Using django model/authentication/authorization within Tornado

    There is a project which is deployed within django. So its authentication system is built from Djang ...

  2. django(权限、认证)系统—— 基于Authentication backends定制

    在这篇文章中,我们进行最后关于DjangoPermission系统的探讨,来谈谈关于Permission系统后台接口和扩展后台接口的开发. Django实现的这套permission体系,在底层被抽象 ...

  3. 用Django Rest Framework和AngularJS开始你的项目

    Reference: http://blog.csdn.net/seele52/article/details/14105445 译序:虽然本文号称是"hello world式的教程&quo ...

  4. django(权限、认证)系统——用户Login,Logout

    上面两篇文章,讲述的Django的Authentication系统的核心模型对象User API和相关的使用,本文继续深入,讨论如何在Web中使用Authentication系统. 前面说了,Djan ...

  5. django中的中间件机制和执行顺序

    这片文章将讨论下面内容: 1.什么是middleware 2.什么时候使用middleware 3.我们写middleware必须要记住的东西 4.写一些middlewares来理解中间件的工作过程和 ...

  6. django内置 Contenttypes 框架

    一.什么是Django ContentTypes? 1.Django 包含一个ContentTypes 应用,它可以追踪安装在你的Django 项目里的所有应用,并提供一个高层次的.通用的接口用于与你 ...

  7. Django remedy a security issue refer dos attack

    Today the Django team is issuing multiple releases -- Django 1.4.8, Django 1.5.4, and Django 1.6 bet ...

  8. Django CBV加装饰器、Django中间件、auth模块

    一. CBV加装饰器 在视图层中,基于函数的视图叫FBV(function base views),基于类的视图叫CBV(class base views).当需要用到装饰器时,例如之前的基于Cook ...

  9. 第六章:Django 综合篇 - 4:django-admin和manage.py

    目录 一.Django内置命令选项 check dbshell diffsettings flush makemigrations migrate runserver shell startapp s ...

随机推荐

  1. ural 1242. Werewolf

    1242. Werewolf Time limit: 1.0 secondMemory limit: 64 MB   Knife. Moonlit night. Rotten stump with a ...

  2. lua ipairs

    tbl = {"alpha", "beta", ["one"] = "uno", ["two"] = ...

  3. BZOJ4298 : [ONTAK2015]Bajtocja

    设f[i][j]为第i张图中j点所在连通块的编号,加边时可以通过启发式合并在$O(dn\log n)$的时间内维护出来. 对于每个点,设h[i]为f[j][i]的hash值,若两个点hash值相等,则 ...

  4. BZOJ3787 : Gty的文艺妹子序列

    将序列分成$\sqrt{n}$块,预处理出每两块之间的逆序对数,以及ap[i]表示前i块内数字出现次数的树状数组 预处理:$O(n\sqrt{n}\log n)$ 修改时,ap[i]可以在$O(\sq ...

  5. POJ 3580 (伸展树)

    题目链接: http://poj.org/problem?id=3580 题目大意:对一个序列进行以下六种操作.输出MIN操作的结果. 解题思路: 六个操作,完美诠释了伸展树有多么吊.注意,默认使用L ...

  6. 【SPOJ】694. Distinct Substrings

    http://www.spoj.com/problems/DISUBSTR/ 题意:求字符串不同子串的数目. #include <bits/stdc++.h> using namespac ...

  7. 【POJ】3261 Milk Patterns

    http://poj.org/problem?id=3261 题意:一个长度为n的串,要求最长的子串的长度且这个子串的出现次数不少于k次.(1<=n<=20000, 2<=k< ...

  8. 【BZOJ】2435: [Noi2011]道路修建(树形dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2435 我怎么感觉那么水.. 坑的是,dfs会爆...好吧..用bfs.. //upd:我的智商也是醉 ...

  9. 泛型,动态创建List<T> (转摘)

    第一种: static void Main()        {            object intList = MakeList(typeof(int), 1, 2, 3);         ...

  10. Java 读写图像

    Java中进行图像I/O(即读图片和写图片,不涉及到复杂图像处理)有三个方法:1. Java Image I/O API,支持常见图片,从Java 2 version 1.4.0开始就内置了.主页:h ...