51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1387|回复: 1
打印 上一主题 下一主题

Django 扩展User 编写自己的认证后台

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-26 11:26:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前言

今天用django写web平台,需要用到账号管理,当然第一时间就想到Django的强大的User模型,各种权限的控制,session的管理都速度解决了。但是Django的管理系统与自己的后台数据库User对象是紧密相连的,而我又不希望用Django User数据库作为我的后台数据库,查了相关资料,发现可以编写自己的认证后台解决。

实现

实现方法就是,编写自己的认证后台,每次登陆的时候在 authenticate 方法中把自己的后台数据中的用户都插入一个相应的Django User对象。这样就可以无缝结合到Django的认证中,享受Django强大的认证后台功能

1.创建自己的后台模块
  1. myauth/
  2. ├── admin.py
  3. ├── auth.py
  4. ├── __init__.py
  5. └── models.py
复制代码

2.models.py
  1. # -*- coding: utf-8 -*-
  2. from django.db import models
  3. import hashlib
  4. #自己的后台数据库表.account
  5. class Account(models.Model):
  6.     username = models.CharField(u"用户名",blank=True,max_length=32)
  7.     password = models.CharField(u"密码",blank=True,max_length=50)
  8.     domain = models.CharField(u"可操作域名",blank=True,max_length=256,help_text='填写多个域名,以,号分隔')
  9.     is_active = models.IntegerField(u"is_active",blank=True)
  10.     phone = models.CharField(u"电话",max_length=50)
  11.     mail = models.CharField(u"邮箱",max_length=50)

  12.     def __unicode__(self):
  13.         return self.username

  14.     def is_authenticated(self):
  15.         return True

  16.     def hashed_password(self, password=None):
  17.         if not password:
  18.             return self.password
  19.         else:
  20.             return hashlib.md5(password).hexdigest()
  21.     def check_password(self, password):
  22.         if self.hashed_password(password) == self.password:
  23.         #if password == self.password:
  24.             return True
  25.         return False
  26.     class Meta:
  27.         db_table = "account"
复制代码

3.auth.py

一个认证后台其实就是一个实现了如下两个方法的类: get_user(id) 和 authenticate(**credentials),我也就是在authenticate中动手脚

  1. # -*- coding: utf-8 -*-
  2. from django.contrib.auth.models import User
  3. from myauth.models import Account
  4. class MyCustomBackend:

  5.     def authenticate(self, username=None, password=None):
  6.         try:
  7.             user = Account.objects.get(username=username)
  8.         except Account.DoesNotExist:
  9.             return None
  10.         else:
  11.             if user.check_password(password):
  12.                 try:
  13.                     django_user = User.objects.get(username=user.username)
  14.                 except User.DoesNotExist:
  15.                     #当在django中找不到此用户,便创建这个用户
  16.                     django_user = User(username=user.username,password=user.password)
  17.                     django_user.is_staff = True
  18.                     django_user.save()
  19.                 return django_user
  20.             else:
  21.                 return None
  22.     def get_user(self, user_id):
  23.         try:
  24.             return User.objects.get(pk=user_id)
  25.         except User.DoesNotExist:
  26.             return None
复制代码

4.admin.py

把自己的后台数据库表也加到django的管理系统里面

  1. from myauth.models import Account
  2. from django.contrib import admin

  3. admin.site.register(Account)
复制代码

5.最后在settings.py中添加自己的认证后台,完成
  1. AUTHENTICATION_BACKENDS = (
  2.     'myauth.auth.MyCustomBackend' ,
  3. )
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-25 21:51 , Processed in 0.067390 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表