zoukankan      html  css  js  c++  java
  • django admin扩展user表password验证及set_password

    一般如果扩展了django user内置表,在admin后台创建新用户的时候密码将会变成明文,故而导致登录不成功。所以我们在admin.py可以通过form自定义进行对password进行操作,可以双重验证并且可以set_password将明文的密码修改成Hash加密过的密码。

    from django.contrib import admin
    from django.contrib.auth.models import AbstractUser
    # Register your models here.
    from user_profile.models import User,LoginLog
    # admin.site.register(User)
    admin.site.register(LoginLog)
    
    from django.contrib.auth import (
        authenticate, get_user_model, password_validation,
    )
    from django.contrib.auth.forms import UsernameField
    
    from django import forms
    from django.contrib.auth.forms import ReadOnlyPasswordHashField
    
    class UserCreationForm(forms.ModelForm):
        """
        A form that creates a user, with no privileges, from the given username and
        password.
        """
        error_messages = {
            'password_mismatch': "The two password fields didn't match.",
        }
        password1 = forms.CharField(
            label="Password",
            strip=False,
            widget=forms.PasswordInput,
        )
        password2 = forms.CharField(
            label="Password confirmation",
            widget=forms.PasswordInput,
            strip=False,
            help_text="Enter the same password as before, for verification.",
        )
    
        class Meta:
            model = User
            fields = ("username",)
            field_classes = {'username': UsernameField}
    
        def __init__(self, *args, **kwargs):
            super(UserCreationForm, self).__init__(*args, **kwargs)
            if self._meta.model.USERNAME_FIELD in self.fields:
                self.fields[self._meta.model.USERNAME_FIELD].widget.attrs.update({'autofocus': ''})
    
        def clean_password2(self):
            password1 = self.cleaned_data.get("password1")
            password2 = self.cleaned_data.get("password2")
            if password1 and password2 and password1 != password2:
                raise forms.ValidationError(
                    self.error_messages['password_mismatch'],
                    code='password_mismatch',
                )
            self.instance.username = self.cleaned_data.get('username')
            password_validation.validate_password(self.cleaned_data.get('password2'), self.instance)
            return password2
    
        def save(self, commit=True):
            user = super(UserCreationForm, self).save(commit=False)
            user.set_password(self.cleaned_data["password1"])
            if commit:
                user.save()
            return user
    from django.contrib.auth.admin import UserAdmin as auth_UserAdmin
    class UserAdmin(auth_UserAdmin):
        add_form = UserCreationForm
    
  • 相关阅读:
    本博客完美的支持移动端
    vue监听滚动事件,元素顶部吸附实现
    提高java反射速度的方法method.setAccessible(true)
    居家必备技能之检测电表是否虚高
    家用无线网络故障排查记录
    java 泛型类的继承关系和转型问题
    Office2019 相关激活秘钥
    IDEA记坑之移动项目文件之后,import 找不到文件以及出现Cannot access的问题
    Idea 可用激活方式
    MySQL 合并查询,以map或对象的形式返回
  • 原文地址:https://www.cnblogs.com/niejinmei/p/8920602.html
Copyright © 2011-2022 走看看