官网教程:https://docs.djangoproject.com/en/2.2/topics/auth/customizing/

app下的model.py

from django.db import models
from django.contrib.auth.models import (
BaseUserManager, AbstractBaseUser,PermissionsMixin
) # Create your models here. class UserProfileManager(BaseUserManager):
def create_user(self, email, name, password=None):
"""
创建用户
"""
if not email:
raise ValueError('用户必须有一个邮箱地址') user = self.model(
email=self.normalize_email(email),
name=name,
) user.set_password(password)
user.save(using=self._db)
return user def create_superuser(self, email, name, password):
"""
创建并保存超级用户
"""
user = self.create_user(
email,
password=password,
name=name,
)
user.is_superuser = True
user.save(using=self._db)
return user class UserProfile(AbstractBaseUser,PermissionsMixin):
email = models.EmailField(
verbose_name='邮箱',
max_length=255,
unique=True,
) name = models.CharField(max_length=32,verbose_name="用户名")
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=True) objects = UserProfileManager() USERNAME_FIELD = 'email' # 登录的字段
REQUIRED_FIELDS = ['name'] # 必须要有的字段 def __str__(self):
return self.email def get_full_name(self):
# The user is identified by their email address
return self.email def get_short_name(self):
# The user is identified by their email address
return self.email class Meta:
permissions = (
('make_myself', '自定制权限'),
)

settings.py文件中需配置:

AUTH_USER_MODEL = 'app01.UserProfile'

在app下的admin.py中配置:

from django import forms

from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField from app01.models import UserProfile class UserCreationForm(forms.ModelForm):
"""A form for creating new users. Includes all the required
fields, plus a repeated password."""
password1 = forms.CharField(label='密码', widget=forms.PasswordInput)
password2 = forms.CharField(label='确认密码', widget=forms.PasswordInput) class Meta:
model = UserProfile
fields = ('email', 'name') def clean_password2(self):
# Check that the two password entries match
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError("密码不匹配")
return password2 def save(self, commit=True):
user = super().save(commit=False)
# 密码明文根据算法改成密文
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user class UserChangeForm(forms.ModelForm):
"""A form for updating users. Includes all the fields on
the user, but replaces the password field with admin's
password hash display field.
"""
password = ReadOnlyPasswordHashField() class Meta:
model = UserProfile
fields = ('email', 'password', 'name', 'is_active',"is_superuser") def clean_password(self):
# Regardless of what the user provides, return the initial value.
# This is done here, rather than on the field, because the
# field does not have access to the initial value
return self.initial["password"] class UserProfileAdmin(BaseUserAdmin):
# The forms to add and change user instances
form = UserChangeForm
add_form = UserCreationForm # The fields to be used in displaying the User model.
# These override the definitions on the base UserAdmin
# that reference specific fields on auth.User.
list_display = ('email', 'name', 'is_staff', 'is_active','is_superuser')
list_filter = ('is_superuser',)
fieldsets = (
(None, {'fields': ('email', 'password')}),
('用户信息', {'fields': ('name',)}),
('系统权限', {'fields': ('is_superuser','is_staff', 'is_active','user_permissions','groups')}),
)
# add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
# overrides get_fieldsets to use this attribute when creating a user.
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('email', 'name', 'password1', 'password2')}
),
)
search_fields = ('email',)
ordering = ('email',)
filter_horizontal = ('user_permissions','groups')

最后在pycharm的命令行生成记录,并同步到数据库

输入命令:python3 manage.py  makemigrations

再次输入:python3 manage.py   migrate

注意:我这里是python3进入python3交互界面,你的可能是python。根据自己情况而定!

最后一步:创建超级用户

启动django项目后,输入admin进入后台管理:

此时,你发现我们的密码是密文,我们必须支持管理员可以在后台修改所有人的密码。

具体步骤如下:

step1

  

step2

step3

templates/password_change.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改密码</title>
</head>
<body>
<h1>修改密码</h1>
<form action="" method="post">
{% csrf_token %}
<p>
<input type="password" name="pwd1" placeholder="密码">
</p> <p>
<input type="password" name="pwd2" placeholder="确认密码">
</p> <p>
<input type="submit" value="修改">
</p>
</form>
</body>
</html>

app01/views.py

def password_reset_form(request,app_name,table_db_name,user_id):

    # 获取被修改对象
user_obj = request.user._meta.model.objects.get(id=user_id)
print("**********:{}".format(user_obj))
can_change_user_password = False
# 管理员修改其他人的密码/管理员修改自己的密码
if request.user.is_superuser or request.user.id == user_obj.id:
print(request.user.is_superuser)
can_change_user_password = True if can_change_user_password:
if request.method == "GET":
return render(request,"password_change.html")
else:
if request.POST.get("pwd1") != "" and request.POST.get("pwd1") == request.POST.get("pwd2"):
user_obj = User.objects.filter(id=user_obj.id).first() user_obj.set_password(request.POST.get("pwd2"))
user_obj.save()
print(request.POST.get("pwd2"))
return redirect("/admin/")
else:
return HttpResponse("只有管理员可以修改密码")

此时,我们就实现了管理员可以在后台修改任何用户的密码

Django自定义认证系统的更多相关文章

  1. django用户认证系统——拓展 User 模型

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  2. Django的认证系统

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...

  3. Django的认证系统—auth模块

    Django的认证系统 auth模块的知识点总结: 1. 创建超级用户 python manage.py createsuperuser from django.contrib import auth ...

  4. django 自定义认证

    在Django中自定义身份验证 Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成的认证系统.定制自己的项目的权限系统需要了解哪些一些关键点,即Django中哪些部分是能够扩展或替 ...

  5. django用户认证系统——拓展 User 模型2

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  6. django用户认证系统——基本设置1

    网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整的.灵活的.易于拓展的用户认证系统:django.contrib.auth.在本教程中,我将向你展示 auth ...

  7. DRF内置认证组件之自定义认证系统

    自定义token认证 我们知道,在django项目中不管路由以及对应的视图类是如何写的,都会走到 dispatch 方法,进行路由分发, 在阅读 APIView类中的dispatch 方法的源码中,有 ...

  8. “Django用户认证系统”学习资料收集

    首推追梦人物——Django用户认证系统 待续……

  9. Django之认证系统

    Django之认证系统 cookie和session 1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞 ...

随机推荐

  1. 一培训机构设计的学习android课程内容:供大家参考

    转自:http://www.cnblogs.com/csj007523/archive/2011/06/16/2082682.html 一培训机构设计的学习android课程内容:供大家参考 第一阶段 ...

  2. AbstactFactory模式

    AbstractFactory模式就是用来解决这类问题的:要创建一组相关或者相互依赖的对象. AbstractFactory模式关键就是将这一组对象的创建封装到一个用于创建对象的类(ConcreteF ...

  3. Microsoft Edge 离线安装包下载

    Microsoft Edge 现已准备就绪 下一版 Microsoft Edge 已准备好进行企业评估. 立即下载离线安装程序.查看管理策略并尝试 Internet Explorer 模式. http ...

  4. python知识点总结02(不定时更新)

    请用至少两种方式实现m与n值交换m=10,n=5 # 方式一 temp = 0 m = 10 n = 5 print(f'方式一交换前,m:{},n:{}') temp = m m = n n = t ...

  5. k8s集群———flannel网络

    #master执行将内网通信地址写入etcd中,确保flannel能与etcd通信 #添加 /opt/etcd/bin/etcdctl --ca-file=/opt/etcd/ssl/ca.pem - ...

  6. iOS定位权限请求时易犯的错误小结

    起因 用户群反馈app可能请求了不合适的定位权限:始终定位. 看到这个截图,根据经验判断可能是后台定位功能导致可能不得不请求始终定位权限.再加上之前提交审核时,苹果要求在plist文件中新增NSLoc ...

  7. CF1277A. Happy Birthday, Polycarp! 题解 枚举/数位DP

    题目链接:http://codeforces.com/contest/1277/problem/A 题目大意: 求区间 \([1,n]\) 范围内有多少只包含一个数字的数. 比如:\(1,77,777 ...

  8. 1048 数字加密 (20 分)C语言

    本题要求实现一种数字加密方法.首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余--这里用 J 代表 ...

  9. CSS单行文字超出省略

    .ellipsis { white-space:nowrap overflow:hidden text-overflow:ellipsis }

  10. three.js中的事件

    以上一篇入门篇为例来简单的设置下3d模型当中的交互事件,上一篇我们已经完成了在3d页面中添加了一个红色球,下面我们给这个球一个点击事件让它Y轴位置上升,再设置一个鼠标移入到球上时让其变色. 1.其实t ...