zoukankan      html  css  js  c++  java
  • 解决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)
  • 相关阅读:
    leetcode108 Convert Sorted Array to Binary Search Tree
    leetcode98 Validate Binary Search Tree
    leetcode103 Binary Tree Zigzag Level Order Traversal
    leetcode116 Populating Next Right Pointers in Each Node
    Python全栈之路Day15
    Python全栈之路Day11
    集群监控
    Python全栈之路Day10
    自动部署反向代理、web、nfs
    5.Scss的插值
  • 原文地址:https://www.cnblogs.com/mstzkot/p/14045979.html
Copyright © 2011-2022 走看看