WEB request中的认证

django使用sessions和middleware和reqeust对象联系在一起

它们通过给每一个reqeust请求添加一个request.user属性来代表当前用户。如果用户没有登录,那么request.user将是AnonymousUser的对象,如果登录了,那么就是User的对象

if request.user.is_authenticated():
# Do something for authenticated users.
...
else:
# Do something for anonymous users.
...

用户登录

login()能够将通过认证的用户加入到当前回话

login(reqeust,user)

login()函数使用HttpRequest和User对象。login()使用session框架在session中保存当前用户id,

from django.contrib.auth import authenticate, login

def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
# Redirect to a success page.
else:
# Return a 'disabled account' error message
...
else:
# Return an 'invalid login' error message.
...

如果你手动验证并使用户登录,那么你要先用authticate()然后在login(),authticate()会在user中设置一个属性,标记那个认证后台成功验证了该用户。

当用户登录后,用户ID和被用来认证该用户的后台被保存在了该用户的session中。在session中保存认证后台的选择顺序是:

1、使用提供的作为参数的后台的值

2、使用authticate()函数添加的后台

3、如果settings中AUTHENTICATION_BACKENDS中只有一个的话,使用它

4、引发一个错误。

用户退出

logout()该函数没有返回值,且不会抛出任何错误信息

from django.contrib.auth import logout

def logout_view(request):
logout(request)
# Redirect to a success page.

当用户退出后,session中关于该用户的所有信息都会清除。

限制用户访问

from django.conf import settings
from django.shortcuts import redirect def my_view(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
from django.shortcuts import render

def my_view(request):
if not request.user.is_authenticated():
return render(request, 'myapp/login_error.html')

装饰器login_required()

login_required(redirect_field_name='next',login_url=None)

该函数做如下工作:

1、如果用户没有登录,重定向到 settings.LOGIN_URL,并把当前访问网页的绝对路径作为查询部分传入到url中。如:/accounts/login/?next=/polls/3/

2、如果用户登录了,直接执行函数。

默认情况下,需要登录之后才能访问的url存放在next中,你可以通过更改redirect_field_name来更换名字。但是你需要自定义你的login 模版。

如果settings.LOGIN_URL中没有指定url或者是url名。那么就需要在该函数中指定。

login_required不检查用户的 is_active标志

LoginRequired mixin

如果使用基于类的 views,那么可以使用LoginRequired mixin 实现和login_required相同的效果

from django.contrib.auth.mixins import LoginRequiredMixin

class MyView(LoginRequiredMixin, View):
login_url = '/login/'
redirect_field_name = 'redirect_to'

权限装饰器

permission——required(perm,login_url=None,raise_exception=False)

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote')
def my_view(request):
...

如果raise_exception改为True,那么就会引发一个PermissionDenied错误,提示404views,而不是跳转到登录页面

如果你即想引发错误,又向允许用户登录,可以同时提供login_required装饰器

from django.contrib.auth.decorators import login_required, permission_required

@login_required
@permission_required('polls.can_vote', raise_exception=True)
def my_view(request):
...

如果你想使用django的认证系统,而又不想使用它的默认模版,可以通过在urlconf里附带参数的方式,指定自定义的模版

urlpatterns = [
url(
'^change-password/$',auth_views.password_change, {'template_name': 'change-password.html'}
),
]

django 认证系统所有的views

login(requesttemplate_name=`registration/login.html`redirect_field_name='next',authentication_form=AuthenticationFormcurrent_app=Noneextra_context=None)

登录成功之后,会跳转到next中的url,如果没有指定那么就会跳转到settings.LOGIN_REDIRECT_URL

login.html中的一部分

{% extends "base.html" %}

{% block content %}

{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %} {% if next %}
{% if user.is_authenticated %}
<p>Your account doesn't have access to this page. To proceed,
please login with an account that has access.</p>
{% else %}
<p>Please login to see this page.</p>
{% endif %}
{% endif %} <form method="post" action="{% url 'login' %}">
{% csrf_token %}
<table>
<tr>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</tr>
<tr>
<td>{{ form.password.label_tag }}</td>
<td>{{ form.password }}</td>
</tr>
</table> <input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form> {# Assumes you setup the password_reset view in your URLconf #}
<p><a href="{% url 'password_reset' %}">Lost password?</a></p> {% endblock %}

logout(requestnext_page=Nonetemplate_name='registration/logged_out.html'redirect_field_name='next',current_app=Noneextra_context=None)

logout_then_login(requestlogin_url=Nonecurrent_app=Noneextra_context=None)

password_change(requesttemplate_name='registration/password_change_form.html',post_change_redirect=Nonepassword_change_form=PasswordChangeFormcurrent_app=None,extra_context=None)

password_change_done(requesttemplate_name='registration/password_change_done.html',current_app=Noneextra_context=None)

password_reset(requestis_admin_site=Falsetemplate_name='registration/password_reset_form.html',email_template_name='registration/password_reset_email.html',subject_template_name='registration/password_reset_subject.txt'password_reset_form=PasswordResetForm,token_generator=default_token_generatorpost_reset_redirect=Nonefrom_email=Nonecurrent_app=None,extra_context=Nonehtml_email_template_name=Noneextra_email_context=None)

password_reset_done(requesttemplate_name='registration/password_reset_done.html'current_app=None,extra_context=None)

password_reset_confirm(requestuidb64=Nonetoken=None,template_name='registration/password_reset_confirm.html'token_generator=default_token_generator,set_password_form=SetPasswordFormpost_reset_redirect=Nonecurrent_app=Noneextra_context=None)

password_reset_complete(requesttemplate_name='registration/password_reset_complete.html',current_app=Noneextra_context=None)

django 认证系统--3的更多相关文章

  1. Django认证系统auth认证

    使用Django认证系统auth认证 auth认证系统可以处理范围非常广泛的任务,且具有一套细致的密码和权限实现.对于需要与默认配置不同需求的项目,Django支持扩展和自定义认证;会将用户信息写入到 ...

  2. django认证系统 Authentication

    Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. Django的认证系统包含了身份验证和权限管理两部分.简单地说,身份验证用于核实某个用户是否合法,权限管理 ...

  3. Django认证系统并不鸡肋反而很重要

    在使用django-admin startproject创建项目后,Django就默认安装了一个采用session实现的认证系统.这是Django相比于其他框架的一大特点:自带认证系统,开箱即用.有人 ...

  4. 自定义Django认证系统的技术方案

    Django已经提供了开箱即用的认证系统,但是可能并不满足我们的个性化需求.自定义认证系统需要知道哪些地方可以扩展,哪些地方可以替换.本文就来介绍自定义Django认证系统的相关技术细节. 自定义认证 ...

  5. django 认证系统--2

    使用django的认证系统 User 对象 User是认证系统的核心.典型代表是用户和你的站点进行交互还有限制访问.注册用户等等.django认证框架中,只存在一个User类,像'superuser' ...

  6. django 认证系统--1

    django的认证系统提供认证和授权两种功能 认证系统包括如下部分: 1.Users 2.Permissions 主要是以 YES/NO 的形式反映一个用户是否能够做某事 3.Groups:就是对多个 ...

  7. Django认证系统实现的web页面

    结合数据库.ajax.js.Djangoform表单和认证系统的web页面 一:数据模块 扩展了Django中的user表,增加了自定义的字段 from django.db import models ...

  8. django认证系统-user对象(创建,改密,认证)

    User对象 User对象是认证系统的核心.它们通常表示与你的站点进行交互的用户,并用于启用限制访问.注册用户信息和关联内容给创建者等.在Django的认证框架中只存在一种类型的用户,因此诸如'sup ...

  9. Django认证系统

    一.cooie与session 1.1 cookie与session cooie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又要保持状态,因此cookie就是在这样的一个场 ...

随机推荐

  1. 微信小程序,个人开发者创业新平台

    在移动互联网世界,微信无小事,微信的事,是整个创业圈的事.经过一年多的酝酿,2017年1月9日,微信小程序发布了.发布伊始,无疑是对整个业界注入一剂兴奋剂,整个微信的生态圈的企业和个人开发者,都跃跃欲 ...

  2. Hadoop2.6.5集群搭建

    一. Hadoop的分布式模型 Hadoop通常有三种运行模式:本地(独立)模式.伪分布式(Pseudo-distributed)模式和完全分布式(Fully distributed)模式.安装完成后 ...

  3. windows 下安装 docker

    1. 使用阿里云的镜像进行安装: http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/ 2. 安装完成后点击图标 “Dock ...

  4. jenkins2.0以后的版本提供自动部署和远程部署功能?

    metting result comment: 持续集成:dev上使用 持续部署:在dev/uat/prod上使用 1.指定时间自动构建--发布第二天挂了?每次构建需要重新编译?qa和uat使用同一套 ...

  5. websocket如何设置?

    根据之前写的步骤到当前的websocket设置 一.websocket设置: 1)在线程租下右键单击选择Sampler如图: 2)进行它的设置 2.保存 3.添加查看结果数和聚合报告(此处不详细说明, ...

  6. parameterized之unittest参数化

    unittest没有想testNG那么方便,可以进行参数化,但是有一个第三方库可是实现参数化 安装 pip install parameterized 该库可以在python的所有单元测试框架中使用 ...

  7. 微信小程序连接本地接口(转)

    原文地址 最近的一个项目就是微信小程序 第一次接触微信开发者工具,并进行小程序的后端开发, 于是想看一下小程序如何请求本地的后台服务接口 wx.request({ url: 'http://local ...

  8. git clone慢

    hosts中添加git域名映射 git安装目录/etc/hosts同样修改

  9. python学习笔记_week14

    Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. s1 import socket def handle_reques ...

  10. MyBatis与Hibernate的区别?

    1.MyBatis学习成本低,Hibernate学习成本高: 2.MyBatis程序员编写SQL,Hibernate自动生成SQL:前者灵活及可优化高,后者不灵活及可优化低: 3.MyBatis适合需 ...