前面我们在登录的时候,是通过输入用户名和密码来进行认证

user=authenticate(username=cd['username'],password=cd['password'])

这个是通过后台设置的django.contrib.auth.backends.ModelBackend来生效的。默认的ModelBackend通过数据库使用django.contrib.auth中的User模型(model)来认证(authentication)用户。

当你使用django.contrib.auth的authenticate()函数,Django会通过每一个定义在AUTHENTICATION_BACKENDS中的后台一个接一个地尝试认证(authentication)用户,直到其中有一个后台成功的认证该用户才会停止进行认证。只有所有的后台都无法进行用户认证(authentication),他或她才不会在你的站点中通过认证(authentication)。

Django提供了一个简单的方法来定义你自己的认证(authentication)后台。一个认证(authentication)后台就是提供了如下两种方法的一个类:

  • authenticate():将用户信息当成参数,如果用户成功的认证(authentication)就需要返回True,反之,需要返回False。
  • get_user():将用户的ID当成参数然后需要返回一个用户对象。

但是如果我们想通过其他方式进行认证,比如注册的邮箱来认证。我们就需要创建一个认证(authentication)后台让用户在我们的站点中使用他们e-mail替代他们的用户名来进行认证(authentication)。

在blog应用中添加一个authentication.py文件,代码如下:

from django.contrib.auth.models import User

class EmailAuthBackend(object):

def authenticate(self,username=None,password=None):

try:

user_list=User.objects.filter(email=username)

print len(user_list)

if len(user_list) > 1:

user=user_list[0]

else:

user=user_list

if user.check_password(password):

return user

return None

except User.DoesNotExist:

return None

def get_user(self,user_id):

try:

return User.objects.get(pk=user_id)

except User.DoesNotExist:

pass

return None

在这里通过user_list=User.objects.filter(email=username)得到所有通过email注册的用户。这里由于其面在新增用户的时候都是通过输入相同的email地址,所以这里采用了User.objects.filter函数,如果每个用户的邮箱地址不一样,则通过User.objects.get函数来获得用户就可以了。

以上代码完成了以下工作内容:

  • authenticate():我们尝试通过给予的e-mail地址获取一个用户和使用User模型(model)中内置的check_password()方法来检查密码。这个方法会对给予密码进行哈希化来和数据库中存储的加密密码进行匹配。
  • get_user():我们通过user_id参数获取一个用户。Django使用这个后台来认证用户之后取回User对象放置到持续的用户会话中。

编辑项目中的settings.py文件添加如下设置:

AUTHENTICATION_BACKENDS=(

'django.contrib.auth.backends.ModelBackend',

'blog.authentication.EmailAuthBackend'

)

通过这种设置,我们保留默认的ModelBacked用来保证用户仍然可以通过用户名和密码进行认证,接着我们包含进了我们自己的email-based认证(authentication)后台

那么在登录界面中,在username中输入用户名和邮箱都可以通过验证。

下面介绍第三方认证:

首先通过pip install social-auth-app-django 安装社交框架

INSTALLED_APPS = (

'social_django',  )

在INSTALLED_APPS中添加应用(settings.py)

更新数据库:

python manage.py migrate

在认证后端添加QQ认证以及QQ互联的key和id(settings.py). 注意:这个key和id需要到QQ去申请

AUTHENTICATION_BACKENDS = (

'social_core.backends.qq.QQOAuth2',

SOCIAL_AUTH_QQ_KEY = 'your qq app id,like some number,for examle 230402020' # QQ APP_ID

SOCIAL_AUTH_QQ_SECRET = 'you qq seckey ,combined by letter with number,for examle: f123bas324' # QQ SECRECT_KEY

SOCIAL_AUTH_QQ_USE_OPENID_AS_USERNAME = True

添加根urls.py的URL路由

urlpatterns = [

url('', include('social_django.urls', namespace='social'))

]

在需要登录的地方加上如下代码:

<a href="{% url "social:begin" "qq" %}">QQ登录 <!-- 这个登录标识注意要满足QQ互联的要求 --></a>

settings.py中的TEMPALTES如下:

TEMPLATES = [

{

'OPTIONS': {

'context_processors': [

'social_django.context_processors.backends',

'social_django.context_processors.login_redirect',

]

}

}

]

最新文章

  1. ZeroMQ(ZMQ)函数接口英汉直译
  2. 学霸数据处理项目之数据处理网页以及后台以及C#代码部分开发者手册
  3. Android开发--Android Studio配置
  4. SU suphasevel命令学习
  5. 利用Jmeter做接口测试
  6. The app references non-public selectors in Payload
  7. 分治(CDQ):[BOI2007]摩基亚Mokia
  8. db file scattered read
  9. pexpect-pxssh-登陆Linux-执行命令
  10. Java集合关于ArrayList
  11. Exception dispatching input event. use XlistView
  12. asp.net core mvc剖析:mvc执行过程(一)
  13. 3)C语言数组(C自考学习)
  14. 我的微服务观,surging 2.0将会带来多大的改变
  15. 使用Microsoft SyncToy 文件同步/备份 自动化处理
  16. 学习python importlib的导入机制
  17. [转]angular2在运行ng serve的时候卡在95% emitting LicenseWebpackPlugin
  18. BeanFactory中Bean的生命周期
  19. Github学习心得体会
  20. 【原创】&lt;Debug&gt; not positioned on a valid record

热门文章

  1. height clientHeight scrollHeight offsetHeight的大致区别
  2. maven配置的问题,maven的环境变量配置
  3. Rails的静态资源管理(二)—— 如何使用 Asset Pipeline
  4. [转]在 Windows 操作系统中的已知安全标识符(Sid security identifiers)
  5. java代码调用数据库存储过程
  6. -bash : ** : command not found的问题解决(图文详解)
  7. myeclipse.ini
  8. 手动编译安装tmux
  9. NLP整体流程的代码
  10. cocos2d-js动作模块使用(自用,只有代码)