Аутентификация на основе токенов в последней версии Django - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь решить проблему, описанную здесь , но код, указанный в , этот ответ не работает для последней версии 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 в настройках MIDDLEWARE.

, но теперь возникла новая проблема:

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

1 Ответ

1 голос
/ 25 апреля 2019

Наследовать ваше промежуточное ПО от 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...