Django世界-迈出第五步-用户认证系统

Django 用户认证系统

认证系统概要

字段含义
create_user创建用户
authenticate验证登录
login记住用户的登录状态
logout退出登录
is_authenticated判断用户是否登录
login_required判断用户是否登录的装饰器

创建用户和验证登录

  1. User模型User模型是抽象的用户,对应总的用户表,可以用来配置页面的访问权限,注册用户的配置文件等功能。Djang中对应的User类只有一个,“超级管理员”(superuser)或“普通用户”(staff)是用户类的属性对象,而不是不同的类。默认的用户的主要属性是:username,password,email,first_name,last_name等,具体的属性请参考官方文档。
  2. 创建用户

创建一个新的用户对象,实际上是实例化处一个User类的对象。通常你可以:
直接创建

from django.contrib.auth.models import User
user = User()
user.username=kevinguo
user.first_name=kevin
user.last_name=guo

底层将password用hash算法加密之后存储到数据库中。
用户的密码不能以明文的方式存储在数据表中,所以应当对密码进行加密运算set_password方法是对明文密码进行加密。

user.set_password("new password")
user.save

使用create_user方法
显然,上述方法不够简便,django为我们提供了更加方便的方法直接创建一个新的用户from

django.contrib.auth.models import User
new_user = User.objects.create_user('kevinguo','kevinguocn@kevinguo.cn','mypassword')

通过上述代码,django相当于执行了我们第一步中的包含save操作的所有内容,这个新的用户已经被保存在用户表中了,如果我们想额外增加新的字段,可以通过如下类似的操作。

user.first_name="kevin"
user.last_name="guo"
user.save()

当用户注册的时候用create_user(username,password,email)默认情况下is_active=True,is_staff=False,is_superuser=False。

  1. 创建超级管理员用户为安全起见,超级管理员用户无法通过如上方法创建,django为我们提供的manage.py 工具包中的方法可以创建一个超级管理员用户`
python manage.py createsuperuser --username=kevinguo --email=kevinguo@kevinguo.cn`

之后,你会被提示输入两次密码,完成创建。如果你带上参数,同时也被要求输入这些。

  1. 更改密码

在shell中更改密码

python manage.py changepassword *username* 

在代码处修改,使用set_password()

user = User.objects.get(username="kevinguo")
user.set_password('new password')
user.save()

特别注意的是,如果用户密码更改后,该用户的所有登陆状态均失效。

  1. 用户验证authenticate
    使用authenticate()来验证用户。它使用username和password作为参数进行验证,对每个身份验证后端(setting.py 中的 authentication backend)进行一一检查,如果有一个认证后端返回一个user对象(class:django.contrib.auth.model User),则停止向下检查。如果后端引发PermissionDenied错误,将返回None.下面在代码中进行举例说明
from django.contrib.auth import authenticate
user = authenticate(username="kevinguo",password="mypassword")
if user:
    pass
else:
    pass

当用户登录的时候用authenticate(username=username,password=password)验证登录,判断数据库中是否存在用户输入的账号和密码,返回一个user对象。
底层将password用hash算法加密后和数据库中password进行对比。

  1. 用户的登陆
    如何将上述已经得到验证的用户添加到当前的会话(session)中?django,使用login()函数来完成。下面的例子综合了上方的authenticate方法和login方法,完整的展示了一个简单的用户认证登陆过程。简便期间,使用视图函数处理。from django.contrib.auth import authenticate,login
def login_view(request):
    username = request.POST['username']
    password = request.POST['password']
user = authenticate(username=username,password=password)
if user:
    login(request,user)
    #返回一个登陆成功的页面
else:
    #返回一个错误页面

7.用户的登出logout()
如果已经通过login登录的用户想要登出,可以在视图中使用django.contrib.auth.logout(),该函数不会返回任何值。from django.contrib.auth import logout

def logout_view(request):
    logout(request)
 #返回一个登出的成功页面

装饰器

某些页面需要用户登录后才能访问,如个人中心,实现的逻辑就是简单地判断当前用户的登录状态而已。

  1. 直接在类视图中写登录校验实现:
class UserInfoView(View):
    """用户中心"""

    def get(self, request):
        """提供个人信息界面"""
        if request.user.is_authenticated():
            return render(request, 'user_center_info.html')
        else:
            return redirect(reverse('users:login'))

Django用户认证系统提供了方法request.user.is_authenticated()来判断用户是否登录。
如果通过登录验证则返回True,反之,返回False。
缺点:登录验证逻辑很多地方都需要,所以该代码需要重复编码好多次

  1. 对路由中as_view()使用装饰器:login_required
    定义路由时添加:
url(r'^info/$', login_required(views.UserInfoView.as_view()), name='info')
  1. 定义验证用户是否登录扩展类
    使用Django自带login_required装饰器来完成扩展,
    完成扩展后需要使用该功能的视图只需多继承该类即可,复用率高
    在自定义工具目录中:
from django.contrib.auth.decorators import login_required

class LoginRequiredMixin(object):
    @classmethod
    def as_view(cls,**kwargs):
        view = super().as_view(**kwargs)
        return login_required(view)

使用时导包并同时继承自定义类LoginRequiredMixin和View即可:

 class UserInfoView(LoginRequiredMixin, View):
    """用户中心"""

    def get(self, request):
        """提供个人信息界面"""
        return render(request, 'user_center_info.html')
  • 装饰器login_required会自带next参数,和重定向地址,用于登录后跳转及不满足登录状态时重定向地址
  • 如果未通过登录验证则被重定向到LOGIN_URL配置项指定的地址。
  • 在设置文件中添加如下配置:表示当用户未通过登录验证时,将用户重定向到路径为/login/的登录页面,
LOGIN_URL = '/login/'
  • 若不设置,默认未通过登录验证时跳转路径为:/accounts/login/
  • 跳转后的next参数,帮助用户在完成登录后,自动跳转回登录前的页面

更多配置

http://www.bubuko.com/infodetail-2415747.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值