博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django 扩展User 编写自己的认证后台
阅读量:6226 次
发布时间:2019-06-21

本文共 2663 字,大约阅读时间需要 8 分钟。

  hot3.png

前言

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

实现

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

1.创建自己的后台模块

myauth/├── admin.py├── auth.py├── __init__.py└── models.py

2.models.py

# -*- coding: utf-8 -*-from django.db import modelsimport hashlib#自己的后台数据库表.accountclass Account(models.Model):    username = models.CharField(u"用户名",blank=True,max_length=32)    password = models.CharField(u"密码",blank=True,max_length=50)    domain = models.CharField(u"可操作域名",blank=True,max_length=256,help_text='填写多个域名,以,号分隔')    is_active = models.IntegerField(u"is_active",blank=True)    phone = models.CharField(u"电话",max_length=50)    mail = models.CharField(u"邮箱",max_length=50)     def __unicode__(self):        return self.username     def is_authenticated(self):        return True     def hashed_password(self, password=None):        if not password:            return self.password        else:            return hashlib.md5(password).hexdigest()    def check_password(self, password):        if self.hashed_password(password) == self.password:        #if password == self.password:            return True        return False    class Meta:        db_table = "account"

 

3.auth.py

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

# -*- coding: utf-8 -*-from django.contrib.auth.models import Userfrom myauth.models import Accountclass MyCustomBackend:     def authenticate(self, username=None, password=None):        try:            user = Account.objects.get(username=username)        except Account.DoesNotExist:            return None        else:            if user.check_password(password):                try:                    django_user = User.objects.get(username=user.username)                except User.DoesNotExist:                    #当在django中找不到此用户,便创建这个用户                    django_user = User(username=user.username,password=user.password)                    django_user.is_staff = True                    django_user.save()                return django_user            else:                return None    def get_user(self, user_id):        try:            return User.objects.get(pk=user_id)        except User.DoesNotExist:            return None

4.admin.py

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

from myauth.models import Accountfrom django.contrib import admin admin.site.register(Account)

 

5.最后在settings.py中添加自己的认证后台,完成

AUTHENTICATION_BACKENDS = (    'myauth.auth.MyCustomBackend' ,)

转载于:https://my.oschina.net/lxcong/blog/145260

你可能感兴趣的文章
Eclipse / Android : “Errors running builder 'Android Pre Compiler' on project…”
查看>>
P1219 N皇后
查看>>
Codeforces Round #449 (Div. 2) C. DFS
查看>>
通用后台管理系统(3)-测试环境是否成功
查看>>
以Drools5.5为例说明“规则引擎在业务系统中应用”---实例
查看>>
[Python]网络爬虫(二):利用urllib2通过指定的URL抓取网页内容(转)
查看>>
Monkey and Banana(基础DP)
查看>>
leetcode-686-Repeated String Match(重复多少次A能够找到B)
查看>>
github page+jekyll构建博客的解决方案
查看>>
2013-7-22 确定鼠标与控件位置关系
查看>>
列、约束重命名,原数据不丢失
查看>>
【笔记】老程序员从头开始学JQuery的读书笔记02
查看>>
单点登录系统(一)
查看>>
[转]性能测试之性能计数器和监测工具
查看>>
HZAU1098: Yifan and War3(区间dp)
查看>>
html
查看>>
关于ajax中async: false的作用
查看>>
GitHub帮助文档翻译1——helloWorld
查看>>
文件的下载,随机验证码(无验证)登录注册
查看>>
第27章 java I/O输入输出流
查看>>