最新Djang中基于令牌的身份验证

2024-04-27 08:01:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图解决here描述的问题,但that answer中提供的代码不适用于最新的django==2.2

我尝试过移植这个代码,但是失败了

设置.py:

MIDDLEWARE = ['polls.mymiddleware.CookieMiddleware',

我的网站/民意调查/authbackend.py:

^{pr2}$

我的网站/民意调查/我的中间件.py:

from django.contrib.auth import authenticate, login, ImproperlyConfigured


class CookieMiddleware(object):
    """Authentication Middleware for OpenAM using a cookie with a token.
    Backend will get user.
    """
    def process_request(self, request):
        if not hasattr(request, 'user'):
            raise ImproperlyConfigured()
        if "thecookiename" not in request.COOKIES:
            return
        # token = request.COOKIES["thecookiename"]
        # REST request to OpenAM server for user attributes.
        # token, attribute, role = identity_manager.get_attributes(token)
        # user = authenticate(remote_user=attribute['uid'][0])
        user = authenticate(remote_user=1)  # simplified for test
        request.user = user
        login(request, user)

结果:

  File "C:\Users\Administrator\Desktop\my_scripts\mysite\mysite\wsgi.py", line 16, in <module>
    application = get_wsgi_application()
  File "C:\Users\Administrator\Desktop\my_scripts\venv\lib\site-packages\django\core\wsgi.py", line 13, in get_wsgi_application
    return WSGIHandler()
  File "C:\Users\Administrator\Desktop\my_scripts\venv\lib\site-packages\django\core\handlers\wsgi.py", line 135, in __init__
    self.load_middleware()
  File "C:\Users\Administrator\Desktop\my_scripts\venv\lib\site-packages\django\core\handlers\base.py", line 37, in load_middleware
    mw_instance = middleware(handler)
TypeError: object() takes no parameters

更新1:修复了上面的问题,感谢@Daniel_Rossman:

need to put your middleware after the SessionMiddleware in your MIDDLEWARE settings.

但现在有了新的问题:

Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\my_scripts\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\Administrator\Desktop\my_scripts\venv\lib\site-packages\django\utils\deprecation.py", line 93, in __call__
    response = self.process_request(request)
  File "C:\Users\Administrator\Desktop\my_scripts\mysite\polls\mymiddleware.py", line 22, in process_request
    login(request, user, backend='polls.mymiddleware.CookieMiddleware')
  File "C:\Users\Administrator\Desktop\my_scripts\venv\lib\site-packages\django\contrib\auth\__init__.py", line 126, in login
    request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
AttributeError: 'NoneType' object has no attribute '_meta'
[25/Apr/2019 12:40:07] "GET /admin/ HTTP/1.1" 500 64298

Tags: djangoinpyvenvrequestmylibline
1条回答
网友
1楼 · 发布于 2024-04-27 08:01:08

MiddlewareMixin继承您的中间件,如下所示

from django.utils.deprecation import MiddlewareMixin

class CookieMiddleware(MiddlewareMixin):
    """Authentication Middleware for OpenAM using a cookie with a token.
    Backend will get user.
    """
    def process_request(self, request):
        if not hasattr(request, 'user'):
            raise ImproperlyConfigured()
        if "thecookiename" not in request.COOKIES:
            return
        # token = request.COOKIES["thecookiename"]
        # REST request to OpenAM server for user attributes.
        # token, attribute, role = identity_manager.get_attributes(token)
        # user = authenticate(remote_user=attribute['uid'][0])
        user = authenticate(remote_user=1)  # simplified for test
        request.user = user
        login(request, user)

相关问题 更多 >