Django 实现编写控制登录和访问权限控制的中间件方法
本文介绍如何在 Django 项目中通过编写自定义中间件来实现详细的权限控制。通过配置 MIDDLEWARE_CLASSES 注册中间件,并在 process_request 方法中检查用户会话、Token 有效性及 URL 路径,从而实现对特定页面的访问限制和登录状态校验,保障系统安全性。
在 Django 开发中,经常需要一种机制来进行更细粒度的权限管理,比如限制特定用户访问特定页面或校验登录状态。实现这一功能的关键在于编写自定义中间件。
Django 项目的 settings.py 文件中包含 MIDDLEWARE_CLASSES 配置项,用于定义中间件列表。用户的请求会先经过这些中间件处理,然后再分发给相应的视图函数。我们需要在配置中添加即将编写的中间件类:
MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', #'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', 'myTransport.views.ExteriorAuthMiddleware', )
接下来是具体的实现代码:
class ExteriorAuthMiddleware(object):
#判断登录 权限控制
def process_request(self,request):
if request.method == 'GET':
requestData = request.GET
else:
requestData = request.POST
request.session['errmsg']=''
#如果用户没有认证,需要转到登录界面
if not request.session.has_key('_auth_user_id') and 'login' not in request.path:
return HttpResponseRedirect('/login/')
#如果用户已经登录
elif request.session.has_key('_auth_user_id') and 'logout' not in request.path:
###权限检验
try:
u=User.objects.get(username=request.user)
#判断token是否过期
if u.usertoken_set.all():
if u.usertoken_set.all()[0].token != request.session['Token']:
logger.error("token 不一致!")
return HttpResponseRedirect('/login/')
else:
logger.error("获取不到token!")
return HttpResponseRedirect('/login/')
url=request.META['PATH_INFO']
print request.get_full_path()
#判断用户是否有某些页面的访问权限,如果没有,转到404页面
if not u.is_superuser:
if url.startswith('/transport/user_') or url.startswith('/log/'):
return error403(request, "权限不够!")
except Exception,e:
logger.error("in function process_request :"+ str(e))
return HttpResponseRedirect('/login/')
#用户已登录,而且url是login,将转到首页
if request.session.has_key('_auth_user_id') and 'login' in request.path:
return HttpResponseRedirect('/index/')
上述内容仅为一个基础示例。
以上就是 Django 实现编写控制登录和访问权限控制的中间件方法的完整内容,希望能对大家有所帮助,也希望大家多多关注本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









