首页 文章

Django自定义auth后端似乎没有被调用?

提问于
浏览
2

我在Python 3上使用Django 1.8.4,并尝试创建一个auth后端,它验证来自旧ColdFusion网站的cookie,并在检查数据库中的值后创建/记录Django用户 . 在设置中,我包括后端:

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

以及后端本身的代码; SiteCFUser是针对SQL Server数据库用户模型的模型,其中包含活动cookie令牌值:

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: authenticated@site+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] != "authenticated@site":
            # 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

问题是,当使用带有 @login_required 的视图访问URL时,或者甚至尝试通过带有用户名和密码的表单登录时,似乎不会调用后端 . 如果我通过在设置中更改类的名称来强制执行错误,或者在cf_auth_backend.py中更改类的名称,则会出现错误 . 但是,控制台中不会显示任何打印语句 . 我'm clearly missing something here: any idea what I'我做得不对?

2 回答

  • 3

    身份验证后端不起作用 . 不会在每个请求或需要身份验证的请求上调用它们 .

    如果要根据某些cookie登录用户,则应在中间件中调用身份验证 .

  • 2

    虽然接受的答案可能对OP有所帮助,但这不是问题 Headers 的一般答案 .

    身份验证后端只需在 AUTHENTICATION_BACKENDS 中列出它们即可 . 但由于各种原因,它们似乎被忽略了,例如:

    • urls.py需要指向像 django.contrib.auth.views.login 这样的东西
    url(r'^accounts/login/$', django.contrib.auth.views.login)
    

    如果它指向其他一些身份验证应用程序 . AUTHENTICATION_BACKENDS 可能无效 .

    • authenticate() 方法必须通过 password=None**kwargs 接受 password 关键字 . 对于 username 也可能是真的 . 它赢得了't be called if it doesn' t接受该关键字参数 .

相关问题