django 之admin 后台的Auth user表字段改造,增加自定义 oauth2 认证admin登陆

文章介绍了如何在Django中改造默认的Auth_user表字段,包括创建子应用、定义新的用户模型并设置AUTH_USER_MODEL,以及在数据迁移后出现错误的解决办法。此外,还展示了如何添加OAuth2认证到Django后台。
摘要由CSDN通过智能技术生成

django在提供Auth模块时,如果需要改造默认的Auth_user表字段

需要在数据迁移初始化之前,一旦做过初始化,再改造,则会报错,此时,可以采用如下方法

1、django 中默认自带的Auth 模块,提供了如下的功能:

@用户管理

@权限

@用户组

@密码哈希系统

@用户登录或内容显示的表单和视图

@一个可插拔的后台系统 admin

2、Django认证系统中提供了用户模型类User保存用户的数据,默认的User包含以下常见的基本字段
字段名 字段描述
username 必选。150个字符以内。 用户名可能包含字母数字,_,@,+ . 和-个字符。
first_name 可选(blank=True)。 少于等于30个字符。
last_name 可选(blank=True)。 少于等于30个字符。
email 可选(blank=True)。 邮箱地址。
password 必选。 密码的哈希加密串。 (Django 不保存原始密码)。 原始密码可以无限长而且可以包含任意字符。
groups 与Group 之间的多对多关系。
user_permissions 与Permission 之间的多对多关系。
is_staff 布尔值。 设置用户是否可以访问Admin 站点。
is_active 布尔值。 指示用户的账号是否激活。 它不是用来控制用户是否能够登录,而是描述一种帐号的使用状态。
is_superuser 是否是超级用户。超级用户具有所有权限。
last_login 用户最后一次登录的时间。
date_joined 账户创建的时间。 当账号创建时,默认设置为当前的date/time。

二、改造方法

1、再项目的根目录下创建一个子应用

python3 manage.py startapp users

2、在配置文件中注册子应用(我的配置文件是settings)

INSTALLED_APPS = [

‘users’,
]

3、在users 下的model.py文件中改造表字段
from django.db import models

from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
	first_name = None # 查看AbstractUser继承的字段,将不需要的设置none
	last_name = None

	"""自定义用户"""
	 mobile = models.CharField(max_length=15, verbose_name="手机号码")
	 avatar = models.ImageField(upload_to="avatar",null=True,blank=True, verbose_name="用户头像")
	 wechat = models.CharField(max_length=50,null=True,blank=True, verbose_name="微信号")
	 REQUIRED_FIELDS = [] # 必填项设置为空,createsuperuser 时填写的项
	
	 class Meta:
	     db_table = "ly_user"
	     verbose_name = "用户信息"
	     verbose_name_plural = verbose_name

4、在配置文件中进行设置(settings)

我们自定义的用户模型类还不能直接被Django的认证系统所识别,需要在配置文件中告知Django认证系统使用我们自定义的模型类。

AUTH_USER_MODEL = 'user.User'

注意:Django建议我们对于AUTH_USER_MODEL参数的设置一定要在第一次数据库迁移之前就设置好,否则后续使用可能出现未知错误。

5、如果在第一次数据迁移以后,才设置AUTH_USER_MODEL自定义用户模型,则会报错。解决方案如下

  1. 先把现有的数据库导出备份,然后清掉数据库中所有的数据表。
  2. 把开发者创建的所有子应用下面的migrations目录下除了__init__.py以外的所有迁移文件,只要涉及到用户的,一律删除
  3. 把django.contrib.admin.migrations目录下除了__init__.py以外的所有迁移文件,全部删除。
  4. 把django.contrib.auth.migrations目录下除了__init__.py以外的所有迁移文件,全部删除。
  5. 把reversion.migrations目录下除了__init__.py以外的所有迁移文件,全部删除。
  6. 把xadmin.migrations目录下除了__init__.py以外的所有迁移文件,全部删除。
  7. 接下来,执行数据迁移,回顾第0步中的数据,以后如果要修改用户相关数据,不需要重复本次操作,直接数据迁移即可。

6、执行数据迁移命令

python manage.py makemigrations
python manage.py migrate

如果要修改admin 登陆后台的认证方式为OAuth2:

新建一个auth(自定义名字)文件夹,包含__init__.py文件,在里面新建backends.py(自定义py文件),写入以下内容:
from django.contrib import auth
from oauth2_provider import backends
import datetime

from app.models import PyxisUser
# 创建了2种验证方式
class OAuth2Backend(backends.OAuth2Backend):
    def authenticate(self, request=None, **credentials):
        return super().authenticate(request, **credentials)

class ModelBackend(auth.backends.ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = PyxisUser.objects.get(username = username,is_staff=True)
            if user and user.check_password(password): # 获取参数,查询用户模型,验证密码
                user.last_login = datetime.datetime.now()
                user.save()
                return user
            else:
                return None
        except Exception as e:
            return None

在setting.py 中设置认证:

INSTALLED_APPS = [
    'jet',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_filters',
    'rest_framework',
    'oauth2_provider', # 添加oauth2
    'app',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
        'oauth2_provider.contrib.rest_framework.OAuth2Authentication' # 如果使用了drf,也可以添加oauth2认证
    ),
}

AUTHENTICATION_BACKENDS = (
    'auth.backends.ModelBackend',  # default默认使用第一个开始认证,失败用第二个
    'auth.backends.OAuth2Backend', # 2个都是自己刚刚定义的认证路径
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值