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>
- ajax的post方法中配置
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
关于涉及到的一些知识,参见:
CSRF