【问题标题】:Token Based Authentication in latest Django最新 Django 中基于令牌的身份验证
【发布时间】:2019-04-25 19:00:34
【问题描述】:

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

我曾尝试移植此代码,但失败了

settings.py:

MIDDLEWARE = ['polls.mymiddleware.CookieMiddleware',

mysite/polls/authbackend.py:

from django.contrib.auth.backends import RemoteUserBackend, UserModel


class Backend(RemoteUserBackend):
    def authenticate(**credentials):
        """We could authenticate the token by checking with OpenAM
        Server.  We don't do that here, instead we trust the middleware to do it.
        """
        try:
            user = UserModel.objects.get(username=credentials['remote_user'])
            print('__user exists')
        except UserModel.DoesNotExist:
            user = UserModel.objects.create(username=credentials['remote_user'])
            print('__user not exists')
        # Here is a good place to map roles to Django Group instances or other features.
        return user

mysite/polls/mymiddleware.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:

需要将中间件放在中间件设置中的 SessionMiddleware 之后。

但现在遇到了新问题:

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

【问题讨论】:

    标签: python django django-middleware


    【解决方案1】:

    像这样从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)
    

    【讨论】:

    • 感谢它有效,但出现了新错误:\lib\site-packages\django\contrib\auth_init_.py",第 99 行,如果 SESSION_KEY 在请求中,则登录.session: AttributeError: 'WSGIRequest' object has no attribute 'session' 你能帮忙吗?
    • 您需要将中间件放在中间件设置中的 SessionMiddleware 之后。
    • @DanielRoseman 非常感谢队友,这对我有帮助,但出现了新问题:文件“C:\Users\Administrator\Desktop\my_scripts\mysite\polls\mymiddleware.py”,第 22 行,在 process_request login(request, user, backend='polls.mymiddleware.CookieMiddleware') 文件 "C:\Users\Administrator\Desktop\my_scripts\venv\lib\site-packages\django\contrib\auth_init_ .py",第 126 行,在登录 request.session[SESSION_KEY] = user._meta.pk.value_to_string(user) AttributeError: 'NoneType' 对象没有属性 '_meta' [25/Apr/2019 12:40:07] "GET /admin/ HTTP/1.1" 500 64298
    猜你喜欢
    • 2016-01-23
    • 2011-06-28
    • 2015-10-07
    • 2015-10-14
    • 2021-01-25
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多