django 登录配置记录

django搭建的web系统中有一个使用ldap校验用户的需求。
之前Java web项目的后台中使用filter防止用户访问一些未授权的资源,比如一个用户未登录则不能访问某些页面。

搜了下django,自带的也有一套认证机制,但是都是要配合数据库使用的。我这里用的ldap,且校验部分的我并不接触,只是去调用其他后台接口获取结果即可。所以使用自带的认证机制配置也有很多问题。
想起filter便搜索了下django中中间件的配置,利用中间件实现登录拦截器 (ps:感谢作者~~)

配置的步骤也很简单,2步即可:
1) 自定义的拦截器
2) settings中middleware添加上1)步骤中的自定义拦截器

	MIDDLEWARE = [
	    'django.middleware.security.SecurityMiddleware',
	    '...',
	    'A.B.SimpleMiddleware' #自定义的拦截器
        ]

自定义拦截器的写法,具体参见官方文档

	#!/usr/bin/env python
	# -*- coding: utf-8 -*-
	from django.shortcuts import render,HttpResponse,redirect,HttpResponseRedirect

	try:
	    from django.utils.deprecation import MiddlewareMixin  # Django 1.10.x
	except ImportError:
	    MiddlewareMixin = object  

	class SimpleMiddleware(MiddlewareMixin):
	    def process_request(self, request):
	        next = request.path
	        request.session.set_expiry(10*1) #django will not expire the session itself with setting
	        loginCheckUrls = ['/company/manager']

	        if (request.path in loginCheckUrls):
	            if  request.session.get('user',None):
	                pass
	            else:
	                return redirect('/company/login/?next='+next)
	        else:
	            pass

如此一来所有请求过来时都会先经过一道filter,如果该页面有访问权限控制且用户未登录时,自动跳转到登录页面,校验成功后再返回页面。校验失败时给出失败提示,始终位于login页面而不跳转。
至于判断用户是否登录,可以通过session来进行判断。当未登录时session中没有user,登录后session中存有user的value。可以设置session的过期时间,一定时间后相当于自动登出。

其中在设置中间件的时候发现了django自带的有CSRF(Cross Site Request Forgery, 跨站域请求伪造)安全校验。只要配置了该中间件,对页面的ajax请求和form表单进行安全校验。前端在处理时需要注意如下两个地方:

1)form中需要添加csrf token。

 	<form action="/webbacklog/loginHandle/" method="post">
             {% csrf_token %}
             <input type="text" name="username"/>
             <input type="text" name="password"/>
        </form>
  1. ajax的post方法中配置 xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));

关于涉及到的一些知识,参见:
CSRF

原文地址:https://www.cnblogs.com/luckyflower/p/7049854.html