• 解决Django扩展用户表后新表内增加用户密码存储为明文


    问题:
    最近在使用Django时,扩展了django自身的auth_user表,大体格式如下:

    from django.contrib.auth.models import User as AbstractUser
    
    class Users(AbstractUser):
    '''
    此表记录系统使用人员详细信息
    '''
    Users_Name = AbstractUser.username
    # 部门编号
    Users_Group = models.ForeignKey(UserGroup, models.CASCADE, db_column="User_Group", null=True, verbose_name="部门编号")
    # 当前用户的权限是第几级别
    Users_Power = models.ForeignKey(UserPower, models.CASCADE, db_column="User_Power", null=True, verbose_name="用户权限")
    # 是否已被锁定
    UserNotActive = models.BooleanField(db_column="IsLock", default=0, verbose_name="是否锁定")

    整体表格是在原表的基础上多加了几列数据,但完成后发现,在django自带的Web后台中从新表增加用户时,密码会被默认使用明文存储至数据库:

    存储到数据库就类似下图所示:

     Django前端正常密码输入位置应类似下图:

    数据库中正确的存储应类似下图:

    解决方法:

    UserAdmin源码主要包含了auth_user表格的信息,可以在继承UserAdmin类的基础上,重写对应的所需数据。如UserAdmin部分源码如下:

    class UserAdmin(admin.ModelAdmin):
    add_form_template = 'admin/auth/user/add_form.html'
    change_user_password_template = None
    fieldsets = (
        (None, {'fields': ('username', 'password')}),
        (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
        (_('Permissions'), {
            'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions'),
        }),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'password1', 'password2'),
        }),
    )
    form = UserChangeForm
    add_form = UserCreationForm
    change_password_form = AdminPasswordChangeForm
    list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')
    list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups')
    search_fields = ('username', 'first_name', 'last_name', 'email')
    ordering = ('username',)
    filter_horizontal = ('groups', 'user_permissions',)

    可以在UserAdmin的基础上,将自己Django项目中对应app的admin视图下,修改为下列信息:

    class UsersAdmin(UserAdmin):
    # 显示元组,携带的字段均为扩展字段,使用了fieldsets后也可不再修改该元组
    list_display = ("Users_Name", "Users_Group", "Users_Phone", "Users_Power", "UserNotActive")
    # 搜索数据时使用的元组, 携带的字段均为扩展字段
    search_fields = ("Users_Name", "Users_Group", "Users_Phone", "Users_Power", "UserNotActive")
    # 排序依据
    ordering = ("Users_Group",)
    # fieldsets 主要用于字段分组,仅应用于显示
    fieldsets = (
        # 此处保留UserAdmin中的password字段,以此保证在新增用户时避免出现明文存储的问题
        (gettext_lazy('基本信息'), {'fields': ('username', 'password', 'first_name', 'last_name', 'email', "Users_Phone")}),
    
        (gettext_lazy('权限信息'), {'fields': ('Users_Group', 'Users_Power', 'UserNotActive')}),
    
        (gettext_lazy('日期信息'), {'fields': ('last_login', 'date_joined')}),
    )
    admin.site.register(models.Users, UsersAdmin)
  • 相关阅读:
    POJ
    POJ
    POJ1753 Flip Game(位运算+暴力枚举)
    20160326 javaweb 请求转发和请求包含
    将博客搬至CSDN
    javaweb 中的乱码问题
    20160324 javaweb 之request
    20160322 javaweb 学习笔记--response验证码实现
    20160322 javaweb 学习笔记--response 重定向
    深入分析 Java 中的中文编码问题 (文章来自网络)
  • 原文地址:https://www.cnblogs.com/mstzkot/p/14045979.html
Copyright © 2020-2023  润新知