1. ##用户认证
  2. django自带用户认证系统,包括认证和授权。用户认证系统由用户,权限,用户组,密码,cookiesession给组成。
  3. ###用户认证系统设置
  4. #settings.py
  5. INSTALLED_APPS中设置
  6.  
  7. django.contrib.auth
  8. django.contrib.contenttypes
  9. MIDDLEWARE 中设置
  10. AuthenticationMiddleware
  11.  
  12. ###用户默认功能
  13. 1)私有属性
  14. username
  15. password
  16. email
  17. first_name
  18. last_name
  19.  
  20. 2)创建普通用户
  21. from django.contrib.auth.models import User
  22. user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
  23.  
  24. 3)创建管理员
  25. python manage.py createsuperuser --username=joe --email=joe@example.com
  26.  
  27. 4)修改密码
  28. from django.contrib.auth.models import User
  29. u = User.objects.get(username='john')
  30. u.set_password('new password')
  31. u.save()
  32.  
  33. 5)验证用户
  34. from django.contrib.auth import authenticate
  35. user = authenticate(username='john', password='secret')
  36. if user is not None:
  37. #验证成功
  38. else:
  39. # 验证失败
  40.  
  41. 6)权限和授权
  42. has_add_permission() #增加权限
  43. has_change_permission()#修改权限
  44. has_delete_permission()#删除权限
  45.  
  46. myuser.groups.set([group_list])
  47. myuser.groups.add(group, group, ...)
  48. myuser.groups.remove(group, group, ...)
  49. myuser.groups.clear()
  50. myuser.user_permissions.set([permission_list])
  51. myuser.user_permissions.add(permission, permission, ...)
  52. myuser.user_permissions.remove(permission, permission, ...)
  53. myuser.user_permissions.clear()
  54.  
  55. 7)默认权限在python manage.py migrate创建
  56.  
  57. 8)添加自定义权限
  58. 比如应用名:foo 模板名: Bar
  59. 添加: user.has_perm('foo.add_bar')
  60. 修改: user.has_perm('foo.change_bar')
  61. 删除: user.has_perm('foo.delete_bar')
  62.  
  63. 9)验证成功登陆
  64. from django.contrib.auth import authenticate, login
  65.  
  66. def my_view(request):
  67. username = request.POST['username']
  68. password = request.POST['password']
  69. user = authenticate(request, username=username, password=password)
  70. if user is not None:
  71. login(request, user)
  72. # Redirect to a success page.
  73. ...
  74. else:
  75. # Return an 'invalid login' error message.
  76. ...
  77.  
  78. 10)检查是登陆成功(session
  79. if request.user.is_authenticated:
  80. # Do something for authenticated users.
  81. ...
  82. else:
  83. # Do something for anonymous users.
  84.  
  85. 11)登出
  86. from django.contrib.auth import logout
  87. def logout_view(request):
  88. logout(request)
  89.  
  90. 12)用装饰器验证是否登陆成功
  91. from django.contrib.auth.decorators import login_required
  92. @login_required
  93. def my_view(request):
  94.  
  95. #如果没有设置settings.LOGIN_URL,就验证没有成功,默认会跳转
  96. 比如 /accounts/login/?next=/polls/3/ next是你验证的页面,如果页面验证成功会还回next页面
  97.  
  98. from django.contrib.auth.decorators import login_required
  99. #验证成功跳到指定的页面
  100. @login_required(login_url='/accounts/login/')
  101. @login_required(redirect_field_name='my_redirect_field')
  102. def my_view(request):
  103.  
  104. 13)限制某些用户登陆
  105. from django.shortcuts import redirect
  106.  
  107. def my_view(request):
  108. if not request.user.email.endswith('@example.com'):
  109. return redirect('/login/?next=%s' % request.path)
  110.  
  111. 14)修改密码
  112. from django.contrib.auth import update_session_auth_hash
  113.  
  114. def password_change(request):
  115. if request.method == 'POST':
  116. form = PasswordChangeForm(user=request.user, data=request.POST)
  117. if form.is_valid():
  118. form.save()
  119. update_session_auth_hash(request, form.user)
  120. else:
  121. ...
  122. ##
  123. <form method="post" action="{% url 'login' %}">
  124. {% csrf_token %}
  125. <table>
  126. <tr>
  127. <td>{{ form.username.label_tag }}</td>
  128. <td>{{ form.username }}</td>
  129. </tr>
  130. <tr>
  131. <td>{{ form.password.label_tag }}</td>
  132. <td>{{ form.password }}</td>
  133. </tr>
  134. </table>
  135.  
  136. <input type="submit" value="login" />
  137. <input type="hidden" name="next" value="{{ next }}" />
  138. </form>
  139.  
  140. 15)默认URL
  141. accounts/login/ [name='login']
  142. accounts/logout/ [name='logout']
  143. accounts/password_change/ [name='password_change']
  144. ###定制用户认证
  145.  
  146. 示例:
  147. #在model里面写入,字段可以该成需要的
  148. from django.db import models
  149. from django.contrib.auth.models import (
  150. BaseUserManager, AbstractBaseUser
  151. )
  152.  
  153. class MyUserManager(BaseUserManager):
  154. def create_user(self, email, date_of_birth, password=None):
  155. """
  156. Creates and saves a User with the given email, date of
  157. birth and password.
  158. """
  159. if not email:
  160. raise ValueError('Users must have an email address')
  161.  
  162. user = self.model(
  163. email=self.normalize_email(email),
  164. date_of_birth=date_of_birth,
  165. )
  166.  
  167. user.set_password(password)
  168. user.save(using=self._db)
  169. return user
  170.  
  171. def create_superuser(self, email, date_of_birth, password):
  172. """
  173. Creates and saves a superuser with the given email, date of
  174. birth and password.
  175. """
  176. user = self.create_user(
  177. email,
  178. password=password,
  179. date_of_birth=date_of_birth,
  180. )
  181. user.is_admin = True
  182. user.save(using=self._db)
  183. return user
  184.  
  185. class MyUser(AbstractBaseUser):
  186. email = models.EmailField(
  187. verbose_name='email address',
  188. max_length=255,
  189. unique=True,
  190. )
  191. date_of_birth = models.DateField()
  192. is_active = models.BooleanField(default=True)
  193. is_admin = models.BooleanField(default=False)
  194.  
  195. objects = MyUserManager()
  196.  
  197. USERNAME_FIELD = 'email'
  198. REQUIRED_FIELDS = ['date_of_birth']
  199.  
  200. def __str__(self):
  201. return self.email
  202.  
  203. def has_perm(self, perm, obj=None):
  204. "Does the user have a specific permission?"
  205. # Simplest possible answer: Yes, always
  206. return True
  207.  
  208. def has_module_perms(self, app_label):
  209. "Does the user have permissions to view the app `app_label`?"
  210. # Simplest possible answer: Yes, always
  211. return True
  212.  
  213. @property
  214. def is_staff(self):
  215. "Is the user a member of staff?"
  216. # Simplest possible answer: All admins are staff
  217. return self.is_admin
  218.  
  219. #注册admin
  220. from django import forms
  221. from django.contrib import admin
  222. from django.contrib.auth.models import Group
  223. from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
  224. from django.contrib.auth.forms import ReadOnlyPasswordHashField
  225.  
  226. from customauth.models import MyUser
  227.  
  228. class UserCreationForm(forms.ModelForm):
  229. """A form for creating new users. Includes all the required
  230. fields, plus a repeated password."""
  231. password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
  232. password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
  233.  
  234. class Meta:
  235. model = MyUser
  236. fields = ('email', 'date_of_birth')
  237.  
  238. def clean_password2(self):
  239. # Check that the two password entries match
  240. password1 = self.cleaned_data.get("password1")
  241. password2 = self.cleaned_data.get("password2")
  242. if password1 and password2 and password1 != password2:
  243. raise forms.ValidationError("Passwords don't match")
  244. return password2
  245.  
  246. def save(self, commit=True):
  247. # Save the provided password in hashed format
  248. user = super().save(commit=False)
  249. user.set_password(self.cleaned_data["password1"])
  250. if commit:
  251. user.save()
  252. return user
  253.  
  254. class UserChangeForm(forms.ModelForm):
  255. """A form for updating users. Includes all the fields on
  256. the user, but replaces the password field with admin's
  257. password hash display field.
  258. """
  259. password = ReadOnlyPasswordHashField()
  260.  
  261. class Meta:
  262. model = MyUser
  263. fields = ('email', 'password', 'date_of_birth', 'is_active', 'is_admin')
  264.  
  265. def clean_password(self):
  266. # Regardless of what the user provides, return the initial value.
  267. # This is done here, rather than on the field, because the
  268. # field does not have access to the initial value
  269. return self.initial["password"]
  270.  
  271. class UserAdmin(BaseUserAdmin):
  272. # The forms to add and change user instances
  273. form = UserChangeForm
  274. add_form = UserCreationForm
  275.  
  276. # The fields to be used in displaying the User model.
  277. # These override the definitions on the base UserAdmin
  278. # that reference specific fields on auth.User.
  279. list_display = ('email', 'date_of_birth', 'is_admin')
  280. list_filter = ('is_admin',)
  281. fieldsets = (
  282. (None, {'fields': ('email', 'password')}),
  283. ('Personal info', {'fields': ('date_of_birth',)}),
  284. ('Permissions', {'fields': ('is_admin',)}),
  285. )
  286. # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
  287. # overrides get_fieldsets to use this attribute when creating a user.
  288. add_fieldsets = (
  289. (None, {
  290. 'classes': ('wide',),
  291. 'fields': ('email', 'date_of_birth', 'password1', 'password2')}
  292. ),
  293. )
  294. search_fields = ('email',)
  295. ordering = ('email',)
  296. filter_horizontal = ()
  297.  
  298. # Now register the new UserAdmin...
  299. admin.site.register(MyUser, UserAdmin)
  300. # ... and, since we're not using Django's built-in permissions,
  301. # unregister the Group model from admin.
  302. admin.site.unregister(Group)
  303.  
  304. #在setting中设置使用那个认证类
  305. settings.py:
  306.  
  307. AUTH_USER_MODEL = 'customauth.MyUser'

43)django-用户认证,授权,自定义用户认证的更多相关文章

  1. Taurus.MVC 微服务框架 入门开发教程:项目集成:4、默认安全认证与自定义安全认证。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  2. drf框架中jwt认证,以及自定义jwt认证

    0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pi ...

  3. django学习日志之自定义用户扩展

    django 为我们提供了强大的用户认证系统,并且提供了基于该系统的User模型,所以,很多时候,我们有必要对自己的user进行业务扩展,得到满足我们自己业务需求的user.借此,写下自己的感悟. u ...

  4. VSCode添加用户代码片段,自定义用户代码片段

    在使用VScode开发中经常会有一些重复使用的代码块,复制粘贴也很麻烦,这时可以在VScode中添加用户代码片段,输入简写即可快捷输入. VScode中添加用户自定义代码片段很简单. 1.在VScod ...

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

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

  6. SpringSecurity(1)---认证+授权代码实现

    认证+授权代码实现 Spring Security是 一种基于 Spring AOP 和 Servlet 过滤器的安全框架.它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和 ...

  7. mysql新建数据库、新建用户及授权操作

    1.创建数据库create database if not exists test176 default charset utf8 collate utf8_general_ci; #utf8_gen ...

  8. vertica创建新用户并授权

    1.创建用户,并设置密码: create user user1 identified by 'pwd1'; 2.把角色授权给用户(dbduser是普通角色): grant dbduser to use ...

  9. CentOS7 添加新用户并授权 root 权限

    参考文章:CentOS 7中添加一个新用户并授权 # root 用户操作 $ 普通用户操作 创建用户 # adduser USERNAME # passwd USERNAME (输入密码) 授权 ro ...

随机推荐

  1. 【由浅入深理解java集合】(三)——集合 List

    第一篇文章中介绍了List集合的一些通用知识.本篇文章将集中介绍List集合相比Collection接口增加的一些重要功能以及List集合的两个重要子类ArrayList及LinkedList. 一. ...

  2. VS Resharper正常代码显示红色处理

    点击重启VS即可.

  3. hadoop3.x的安装

    请看https://www.cnblogs.com/garfieldcgf/p/8119506.html

  4. Spring使用事务增加的注解实现方

    以下是我的文件结构 步骤1:配置数据源 <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDa ...

  5. python 学习 argparse

    1. argparse python 中用于解析命令行参数和选项的标准模块 创建一个解析器对象,解析器类ArgumentParser add_argument() 方法用来指定程序接受那些命令行参数, ...

  6. BN_batch normalization

    参考: https://zhuanlan.zhihu.com/p/27938792 做法 设,每个batch输入是 (其中每个 都是一个样本, 是batch size) 假如在第一层后加入Batch ...

  7. VS中ipch文件夹和sdf文件的处理方式

    ipch文件夹和sdf是VS产生的预编译头文件和智能提示信息,对编码没有影响,可存放在固定的位置,定期进行清理

  8. plsql 根据sid连接oracle

    ORCL73 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.73)(PORT = 152 ...

  9. Frameset 框架

      <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.c ...

  10. [C++]2-2 韩信点兵

    /* 韩信点兵 相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队 形,而他每次只掠一眼队伍的排尾就知道总人数了.输入多组数据,每组数据包含3个非负整数 ...