django-用户验证系统

django提供了一套用户验证系统,可是要使用这个系统,必需要使用django内置的用户模型:django.contrib.auth.models.User,这个模型中预先定义了一些字段,其中只有username和password是必须的。
 
username
用户名,该字段是必须的,长度限制版本之间可能存在差别,1.10为150个字符之内(其余版本为30个字符,存在版本差别)。能够是字母、数字、+、-、_、.、@。这几个字符。在1.10版本中,django正式支持utf-8的用户名(也就是不受字符限制了),固然前提是要使用python3.x的版本。
 
固然,你也可使用max_length、min_length等属性来控制用户名的长短限制。下面的字段基本也适用。
 
django在1.10中实现了两个验证器,其会根据python版本自动选取,通常不用咱们担忧。可使用username_validator(New in Django 1.10.)属性查看验证器:默认  validators.UnicodeUsernameValidator于Python 3 、 validators.ASCIIUsernameValidator于Python 2.
 
固然咱们也能够改变验证器,例如将python3的验证器改为ASCII的:
 
from django.contrib.auth.models import User
from django.contrib.auth.validators import ASCIIUsernameValidator
class CustomUser(User):
  username_validator = ASCIIUsernameValidator()
  class Meta:
    proxy = True # If no new field is added.

 

上面咱们首先子类化了User model,而后改变了username_validator属性,这也是标准的修改步骤。
 
password
密码,必须。django不会直接储存原始密码,而是储存通过处理以后的哈希值。因此在建立用户或修改密码的时候不能直接操做这个属性,而是使用django提供的专门的方法,下面会再说明。
 
email
可选,表示email地址。
 
first_name
可选,30个字符之内(在中文环境中应该用不上)
 
last_name
可选,30个字符之内
 
groups
Many-to-many relationship to  Group
Group属于多对多的关系,而 Group表示的是用户组,由另外一种表储存。
 
user_permissions
Many-to-many relationship to  Permission
Permission属于多对多的关系,而 Permission表示的是权限,由另外一种表储存。
关于权限的问题须要另外说明,这里暂时不讨论。
 
is_active
表用户是不是活跃的,是一个布尔值。django提议与其删除一个用户的全部信息,还不如将其设置为非活跃(即冻结)状态。这样不会破坏其余相关的外键关系,同时也拥有了后悔的可能。
 
注意:在1.10以前,django的后台验证程序不会检查用户是否处于活跃状态,也就是非活跃的用户依然能够登陆,此时要本身进行状态验证,例如:
 
if user.is_active: # 若用户是活跃的,即未冻结的,在1.10以前冻结用户默认也能登陆,因此须要本身认证
    login(request, user) # 登陆
    ...... #其余处理
else:
    return HttpResponse('用户被冻结')

 

在1.10版本中,django的默认验证后台会拒绝冻结用户的访问了。当冻结的用户登陆时,会没法经过  authenticate(username=None, password=None, **kwargs) 的验证,即该方法会返回None。
 
is_staff
是否为staff身份,布尔值。拥有staff身份的用户能够登陆django的admin后台,且可使用  staff_member_required(redirect_field_name='next', login_url='admin:login') 装饰器来进行访问控制。详情参考 django-访问控制 篇。
 
is_superuser
是不是superuser身份,布尔值。拥有该身份的用户将可以登陆admin后台,并拥有全部注册模型的管理权限。
 
last_login
用户最后登陆的时间。
 
date_joined
用户建立的时间。
 
以上就是django自带的用户认证系统使用的模型的所有字段了,也就是说django在数据库中储存的字段信息就是以上这些,若是须要扩展的话,有两种方法:
 
1.另外再写一个模型,用OneToOne的形式关联到User中:
 
 
from django.db import models
from django.contrib.auth.models import User
 
 
class UserInfo(models.Model):
    user = models.OneToOneField(User)
    head_img = models.ImageField()
    # 其它扩展

 

 
2.另写一个模型,直接继承User:
 
from django.db import models
from django.contrib.auth.models import User
 
 
class UserInfo(User):
    head_img = models.ImageField()
    # 其它扩展

 

 
不管哪一种方法均可以,由于那些已经定义好的字段都是储存在User表中的,而新增的字段储存在另外的表中,只是使用OneToOne的时候,查询的入口略麻烦了些,详情参考django的models。
 

用户注册:
 
所谓的用户注册,其实就是在User表中新建立一条记录,而前面说过了,password字段储存的不是原始密码,而是加密后的字符串,因此不能直接对User对象的属性进行修改,而是要调用专用的函数:
 
>>> from django.contrib.auth.models import User >>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')

 

此时,用户就已经建立 并放到数据库中了,这个方法比较特别,其自动为咱们保存数据。
 

密码修改:
 
因为密码字段不能直接操做,因此django也提供了函数专门用来修改密码:
 
>>> from django.contrib.auth.models import User 
>>> u = User.objects.get(username='john')
>>> u.set_password('new password') 
>>> u.save()

 

这里有一个细节,它不像建立帐户同样会直接保存的数据库中,而是调用User对象的save()方法,表示将修改保存到数据库中。
 

资料修改:
 
其余的字段能够经过直接修改对象属性的方法来修改数据,而后调用保存方法。
 
例如,我想修改用户的email:
 
request.user.email = date['email'] # date的表单提交上来的数据
request.user.save() # 保存修改

 

 
通常资料修改须要用户登陆以后才能修改,而登陆后的用户能够是使用request.user来获取当前登陆的用户,而后咱们直接对其email属性进行修改,数据来自于用户提交的表单(你能够直接将其当作'scolia@example.com'这样的直接的字面量)。最后咱们调用其save方法,其实除了password相关的操做须要调用辅助函数以外,其余的基本都能这样修改,这也是模型数据修改的典型方法。
 

用户验证:
 
要实现咱们日常须要的验证登陆的功能,须要两个步骤,第一步是验证用户名和密码是否正确,第二步将用户登陆。
 
from django.contrib.auth import authenticate
 
user = authenticate(username=date['user_name'], password=date['password'])

 

username和password两个参数分别接受要登陆用户的用户名和密码,这里传的是明文。 若验证经过,其会返回User对象,这个User对象记录了所用的用户信息,你能够对这个对象进行资料的修改等之类的操做。 若登陆失败则返回None
 
用户登陆:
 
验证成功以后,就能够进行登陆操做了,django提供了专门的登陆函数来处理这个工做:
 
from django.contrib.auth import authenticate, login
 
user = authenticate(username=date['user_name'], password=date['password'])

if user is not None:
    login(request, user)
    #.....
else:
    return HttpResponse('用户名或密码错误')

 

这里的核心思想就是登陆失败后,返回的是None,而判断到user不为None,即验证成功了,就能够
进行登陆操做了,不然返回错误。
 
这里详细的了解一下login这个函数:
 
  login(request, user, backend=None) 
 
其中request要求的是HttpRequest对象,也就是视图的第一个参数所接受到的对象,习惯性的使用request,user要求要登陆的User对象,也就是验证成功后返回的User对象。backend是1.10中新增的,其做用是指定特色的后台程序,通常用不着,如有特殊需求能够参考django1.10的官方文档。
 
因为HTTP协议是无状态协议,因此使用的拓展的cookie和session首部来进行状态记录,django采用的是session,在登陆成功后,django会给客户端设置session首部,其通常是一个用户的ID,而不是用户的详细信息。客户端登陆后访问时都会回送这个ID,django接受到ID后找到对应的用户,从而得知当前的访问是哪一个用户。实现了登陆的功能。
 

用户注销:
 
上面说过用户的状态是经过session来记录的,也就是将session设置为空后,即丢失登陆状态,这就是注销了。django一样提供了变量的函数来完成这个工做:
 
 
from django.contrib.auth import logout
 
def logout_view(request):
    logout(request) # Redirect to a success page.

 

让咱们来认识一下这个函数:
 
  logout(request) 
 
其接收的只有一个参数,也就是当前的request对象。其所完成的就是重置session的工做。若是用户没有登陆,也不会报错。
 
注意:这个仍是会清空全部的session,也就是说若是你有不但愿被删除的session的话,要先获取到相应的session,并在调用logout以后再将其收到添加进去。
 

 
这里初步解释了django中用户验证系统的使用,要获取更多信息能够查看官方文档,或者我的提供了一份略微翻译了的文档: http://note.youdao.com/yws/public/redirect/share?id=b67cd6af80e4c59da71c47b85b5f3253&type=false
相关文章
相关标签/搜索