0

Я использую Django 1.8.4 на Python 3 и пытаюсь создать резервный сервер auth, который проверяет файл cookie с устаревшего веб-сайта ColdFusion и создает/регистрирует пользователя Django после проверки значения в базе данных. В настройках я включаю бэкэнд:Django custom auth backend, похоже, не называется?

AUTHENTICATION_BACKENDS = (
    'site_classroom.cf_auth_backend.ColdFusionBackend', 
) 

И код для самого бэкэнд; SiteCFUser модель от пользовательской модели базы данных SQL Server, которая содержит активное печенье значение маркера:

from django.contrib.auth.backends import ModelBackend 
from django.contrib.auth import get_user_model 
from users.models import SiteCFUser 


class ColdFusionBackend(ModelBackend): 
    """ 
    Authenticates and logs in a Django user if they have a valid ColdFusion created cookie. 

    ColdFusion sets a cookie called "site_web_auth" 
    Example cookie: [email protected]+username+domain+8E375588B1AAA9A13BE03E401A02BC46 
    We verify this cookie in the MS SQL database 'site', table site_users, column user_last_cookie_token 
    """ 

    def authenticate(self, request): 
     User = get_user_model() 

     print('Hello!') 
     token=request.COOKIES.get('site_web_auth', None) 
     print('Token: ' + token) 
     cookie_bites = token.split('+') 

     if cookie_bites[0] != "[email protected]": 
      # Reality check: not a valid site auth cookie 
      return None 

     username = cookie_bites[1] 
     cf_token = cookie_bites[3] 

     try: 
      site_user = SiteCFUser.objects.using('mssqlsite').filter(cf_username=username) 
     except: 
      # No user found; redirect to login page 
      return None 

     if site_user[0].cftoken == cf_token: 
      try: 
       # Does the user exist in Django? 
       user = User.objects.get(username=username) 
      except: 
       # User does not exist, has a valid cookie, create the User. 
       user = User(username=username) 
       user.first_name = site_user[0].cf_first_name 
       user.last_name = site_user[0].cf_last_name 
       user.email = site_user[0].cf_email 
       user.save() 
     else: 
      return None 

    def get_user(self, user_id): 
     User = get_user_model() 

     try: 
      return User.objects.get(pk=user_id) 
     except User.DoesNotExist: 
      return None 

Проблема заключается в том, бэкенд, кажется, не будет вызываться, когда попав в URL с видом с @login_required, или даже пытается войти через форму с именем пользователя и паролем. Если я заставляю ошибку, изменяя имя класса в настройках или изменяя имя класса в cf_auth_backend.py, я получаю сообщение об ошибке. Однако ни один из операторов печати не отображается в консоли. Мне явно не хватает чего-то здесь: любая идея, что я не делаю правильно?

+0

Все '@ login_required' делает перенаправление на страницу входа, если пользователь еще не прошел аутентификацию. Вам нужно будет показать код для этого представления. –

ответ

1

Аутентификация бэкэндов не работает. Они не будут вызываться по каждому запросу или по запросам, где требуется аутентификация.

Если вы хотите войти в систему на основании некоторого файла cookie, вы должны вызывать аутентификацию в промежуточном программном обеспечении.

2

Хотя принятый ответ, возможно, помог ОП, это не общий ответ на заголовок вопроса.

Аутентификация задних концов do просто перечислите их в AUTHENTICATION_BACKENDS. Но они могут показаться игнорироваться по разным причинам, например .:

  • urls.py необходимо указать на то, как django.contrib.auth.views.login

    url(r'^accounts/login/$', django.contrib.auth.views.login) 
    

    , если он указывает на некоторое другое приложение аутентификации. AUTHENTICATION_BACKENDS может не работать.

  • метод authenticate() должен принять password ключевое слово, либо через password=None или **kwargs. Вероятно, верно и для username. Он не будет вызываться , если он не принимает этот аргумент ключевого слова.

 Смежные вопросы

  • Нет связанных вопросов^_^