参考资料:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/    直接拉到最后看栗子啦

django自定义用户认证(使用自定义的UserProfile,而不是django自带的),就需要(django要求)将为UserProfile单独常见一个app,这个app啥也不干,就是为UserProfile而生的;

这里我们创建一个app,名字叫做Wolf,事实上,我们只需要对其中的models文件和admin.py做操作就可以了;

第一步:创建user model

下面是models.py文件的内容:

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3. __author__ = "charles"
  4. """
  5. 自定义用户认证
  6. """
  7.  
  8. from django.db import models
  9.  
  10. from django.contrib.auth.models import (
  11. BaseUserManager,AbstractBaseUser
  12. )
  13.  
  14. class MyUserManager(BaseUserManager):
  15. def create_user(self, email, name, password=None):
  16. """
  17. Creates and saves a User with the given email, date of
  18. birth and password.
  19. """
  20. if not email:
  21. raise ValueError('Users must have an email address')
  22.  
  23. user = self.model(
  24. email=self.normalize_email(email),
  25. name = name,
  26. )
  27.  
  28. user.set_password(password)
  29. user.save(using=self._db)
  30. return user
  31.  
  32. def create_superuser(self, email, name, password):
  33. """
  34. Creates and saves a superuser with the given email, date of
  35. birth and password.
  36. """
  37. user = self.create_user(
  38. email,
  39. password=password,
  40. name=name,
  41. )
  42. user.is_admin = True
  43. user.save(using=self._db)
  44. return user
  45.  
  46. class UserProfile(AbstractBaseUser):
  47. email = models.EmailField(
  48. verbose_name='email address',
  49. max_length=255,
  50. unique=True,
  51. )
  52. name = models.CharField(max_length=32)
  53. # date_of_birth = models.DateField()
  54. is_active = models.BooleanField(default=True)
  55. is_admin = models.BooleanField(default=False)
  56.  
  57. objects = MyUserManager() #实例化类,这个必须要有
  58.  
  59. USERNAME_FIELD = 'email'
  60. REQUIRED_FIELDS = ['name'] #必须填写的字段
  61.  
  62. def get_full_name(self):
  63. # The user is identified by their email address
  64. return self.email
  65.  
  66. def get_short_name(self):
  67. # The user is identified by their email address
  68. return self.email
  69.  
  70. def __str__(self): # __unicode__ on Python 2
  71. return self.email
  72.  
  73. def has_perm(self, perm, obj=None): #有没有指定的权限
  74. "Does the user have a specific permission?"
  75. # Simplest possible answer: Yes, always
  76. return True
  77.  
  78. def has_module_perms(self, app_label):
  79. "Does the user have permissions to view the app `app_label`?"
  80. # Simplest possible answer: Yes, always
  81. return True
  82.  
  83. @property
  84. def is_staff(self):
  85. "Is the user a member of staff?"
  86. # Simplest possible answer: All admins are staff
  87. return self.is_admin

第二步:to register this custom user model with Django’s admin, the following code would be required in the app’s admin.py file:

  1. from django.contrib import admin
  2.  
  3. # Register your models here.
  4. from Wolf import models
  5.  
  6. from django import forms
  7. from django.contrib import admin
  8. from django.contrib.auth.models import Group
  9. from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
  10. from django.contrib.auth.forms import ReadOnlyPasswordHashField
  11.  
  12. class UserCreationForm(forms.ModelForm):
  13. """A form for creating new users. Includes all the required
  14. fields, plus a repeated password."""
  15. password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
  16. password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
  17.  
  18. class Meta:
  19. model = models.UserProfile
  20. fields = ('email', 'name','is_active','is_admin')
  21.  
  22. def clean_password2(self):
  23. # Check that the two password entries match
  24. password1 = self.cleaned_data.get("password1")
  25. password2 = self.cleaned_data.get("password2")
  26. if password1 and password2 and password1 != password2:
  27. raise forms.ValidationError("Passwords don't match")
  28. return password2
  29.  
  30. def save(self, commit=True):
  31. # Save the provided password in hashed format
  32. user = super(UserCreationForm, self).save(commit=False)
  33. user.set_password(self.cleaned_data["password1"])
  34. if commit:
  35. user.save()
  36. return user
  37.  
  38. class UserChangeForm(forms.ModelForm):
  39. """A form for updating users. Includes all the fields on
  40. the user, but replaces the password field with admin's
  41. password hash display field.
  42. """
  43. password = ReadOnlyPasswordHashField()
  44.  
  45. class Meta:
  46. model = models.UserProfile
  47. fields = ('email', 'password', 'name', 'is_active', 'is_admin')
  48.  
  49. def clean_password(self):
  50. # Regardless of what the user provides, return the initial value.
  51. # This is done here, rather than on the field, because the
  52. # field does not have access to the initial value
  53. return self.initial["password"]
  54.  
  55. class UserAdmin(BaseUserAdmin):
  56. # The forms to add and change user instances
  57. form = UserChangeForm
  58. add_form = UserCreationForm
  59.  
  60. # The fields to be used in displaying the User model.
  61. # These override the definitions on the base UserAdmin
  62. # that reference specific fields on auth.User.
  63. list_display = ('email', 'name', 'is_admin')
  64. list_filter = ('is_admin',)
  65. fieldsets = (
  66. (None, {'fields': ('email', 'password')}),
  67. ('Personal info', {'fields': ('name',)}),
  68. ('Permissions', {'fields': ('is_admin',)}),
  69. )
  70. # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
  71. # overrides get_fieldsets to use this attribute when creating a user.
  72. add_fieldsets = (
  73. (None, {
  74. 'classes': ('wide',),
  75. 'fields': ('email', 'name', 'password1', 'password2')}
  76. ),
  77. )
  78. search_fields = ('email',)
  79. ordering = ('email',)
  80. filter_horizontal = ()
  81.  
  82. # Now register the new UserAdmin...
  83. admin.site.register(models.UserProfile, UserAdmin)
  84. # ... and, since we're not using Django's built-in permissions,
  85. # unregister the Group model from admin.
  86. admin.site.unregister(Group)

  

第三步:创建完上述UserProfile的类之后,需要告诉django,系统使用自定义的用户认证系统啦,需要在settings中指定:

  1. AUTH_USER_MODEL = 'Wolf.UserProfile' #AppName.自定义user

 

 最后,如果项目中已经存在其他的app,其他的app可能需要依赖UserProfile表,所以需要先将wolf注册,然后python manage.py makemigrations和python manage.py migrate同步之后,在将其他的app注册进来,创建其对应的表结构;

如果其他的表结果已经创建了,在运气非常不好的情况下,可能需要删除表才可以le~~~~~

 

使用django实现自定义用户认证的更多相关文章

  1. django rest framework用户认证

    django rest framework用户认证 进入rest framework的Apiview @classmethod def as_view(cls, **initkwargs): &quo ...

  2. 43)django-用户认证,授权,自定义用户认证

    ##用户认证 django自带用户认证系统,包括认证和授权.用户认证系统由用户,权限,用户组,密码,cookie和session给组成. ###用户认证系统设置 #settings.py INSTAL ...

  3. Django自定义用户认证

    自定义一个用户认证 详细参考官方文档: https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#django.contrib.au ...

  4. CMDB资产管理系统开发【day25】:Django 自定义用户认证

    官方文档:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#substituting-a-custom-user-mode ...

  5. Django自定义用户认证系统之自定义用户模型

    参考文档:http://python.usyiyi.cn/django/topics/auth/customizing.html Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成 ...

  6. Django 中自定义用户模型及集成认证授权功能总结

    1. 概述 Django 中的 django.contrib.auth 应用提供了完整的用户及认证授权功能. Django 官方推荐基于内置 User 数据模型创建新的自定义用户模型,方便添加 bir ...

  7. 自定义用户认证(继承django的)

    1.在app下创建一个自己用户认证文件,文件名随意,记得为.py文件 2.编辑该userauth.py文件 #!/usr/bin/env python #coding:utf-8 from djang ...

  8. Django 中的用户认证

    Django 自带一个用户认证系统,这个系统处理用户帐户.组.权限和基于 cookie 的 会话.本文说明这个系统是如何工作的. 概览 认证系统由以下部分组成: 用户 权限:控制用户进否可以执行某项任 ...

  9. Django组件之用户认证组件

    一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenticate( ...

随机推荐

  1. window自带的公式面板

    如何使用Windows数学输入面板生成数学公式 数学输入面板是一个Windows自带的数学公式编辑软件,该软件最大的特点就是可以简单方便地写出数学公式.本文主要探讨该软件的一些基本用法. 工具/原料 ...

  2. MySQL存储过程 事务transaction

    MySQL 中,单个 Store Procedure(SP) 不是原子操作,而 Oracle 则是原子的.如下的存储过程,即使语句2 失败,语句 1 仍然会被 commit 到数据库中: create ...

  3. json与bson的区别

    bson是由10gen开发的一个数据格式,目前主要用于mongoDB中,是mongoDB的数据存储格式.bson基于json格式,选择json进行改造的原因主要是json的通用性及json的schem ...

  4. angularjs的ng-class

    <!--第一种 直接加变量--> <div ng-class="tempClass"></div> <!--第二种 用{{}} 包住的变量 ...

  5. 获取图片src

    用jquery获取图片src(不知道为什么总是undefined): $('img').eq(i).src; $('img').eq(i).attr('src'); //上面两种都是获取不到,不知道为 ...

  6. 网页静态处理技术FreeMarker概述

    FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP.它不仅 ...

  7. SAPCertifiedTechnologyAssociate-SystemAdministration(SAPHANAasaDatabase)

    C_TADM55_75 SAP Certified Technology Associate - System Administration (SAP HANA as a Database) with ...

  8. Linux实用命令整理

    说明 点击标题可进入详细讲解的章节 0. 基本命令 linux 基本命令整理 1. 压缩 解压 tar -zcvf a.tar.gz a #把a压缩成a.tar.gz tar -zxvf a.tar. ...

  9. python中str的索引、切片

    1 a = "hello" 2 a1 = a[1] 3 a2 = a[0:2] 4 print(a1) 5 print(a2) 我们通过索引获取字符串中指定位数的字符 通过切片获取 ...

  10. jenkins部署配置

    https://www.cnblogs.com/rslai/p/8135460.html 修改jenkins的默认端口号: https://blog.csdn.net/qq_32440951/arti ...