我已经使用Django实现了后端api。环境详细信息为-
环境: 平台:Linux(ubuntu) 框架:Django 1.11.28 编程语言:python 2.7.12(将来计划迁移3.8) 数据库:Mongodb 3.4
说明: 我已经使用django开发了Web服务。这些是普通的Web服务,不是Restful的(以前没有为Django rest框架提供对mongodb的完全支持),因此大多数内容不是按照django标准定制的。
问题详细信息: 为了进行身份验证,我使用的是Azure AD。我编写了一个简单的装饰器,该装饰器从前端Web应用程序/移动设备发送的请求中接收访问令牌,然后该装饰器将验证令牌并返回视图。对于身份验证,我使用的是django-auth-adfs包
def is_authorized(function):
@wraps(function)
def authorize(request, *args, **kwargs):
# access token validation logic
if validated(token):
# get user details from access token first_name, last_name etc
user_info = {"first_name":"foo","last_name":"bar"}
return function(request, *args, **kwargs)
else:
return HttpResponse('Unauthorized', status=401)
return authorize
@is_authorized
def home_view(request):
# calling function which decodes access token and return user details.
# This function contains same code as in decorator except function it returns user_info
**first_name, last_name = get_userinfo_from_access_token(request)**
return JsonResponse({"data":{"fname":first_name,"lname":last_name}})
如您所见,代码变得凌乱且重复。在这里,我无法访问已在视图中解码的用户详细信息。为了获得用户详细信息,我通过传递请求对象在get_userinfo_from_access_token()函数中编写了相同的代码,我认为这不是'ok'。
考虑我当前的情况和环境,
如果我不清楚任何内容,并且需要更多详细信息,请告诉我。 预先感谢。
答案 0 :(得分:1)
好吧。让我按顺序给出您的答案。
现在回到中间产品。 中间件按顺序工作。无效的订单可能无效
第一中间件
class UserResolverMiddleware(MiddlewareMixin):
"""
A middleware class that adds a ``user`` attribute to the current request.
"""
def process_request(self, request):
"""
get token from request header
validate token
decode the token
query on db or attach a fake user with necessary decoded data.
attach user object to request like request.user = user
"""
第二个。
from django.http import HttpResponseForbidden
class ProtectedViewMiddleware(MiddlewareMixin):
def process_request(self, request):
"""
create a list of URL which is not protected (e.g: login, forget password)
unprotected_list = ['']
if request url does not belongs to unprotected_list and request has no attribue user:
return HttpResponseForbidden()
return
"""