3

我正在使用自定义身份验证后端与Django,以自动创建和从旧系统登录用户。我的Backend类是这样的:Django - 阅读当前的用户认证后端类

from django.contrib.auth.backends import ModelBackend 
from django.contrib.auth.models import User 
from sfi.models import Employee 
import base64, hashlib 

class SFIUserBackend(ModelBackend): 
    def authenticate(self, username=None, password=None): 
     if not username or not password: 
      return 

     digest = base64.standard_b64encode(hashlib.md5(password).digest()) 
     user = None 
     try: 
      employee = Employee.objects.get(login=username, passwd=digest) 
      user, created = User.objects.get_or_create(username=username) 
      if created: 
       # setting attributes 
       user.first_name = employee.names[:30] 
       user.last_name = employee.surnames[:30] 
       user.is_staff = True 
       user.save() 
     except Employee.DoesNotExist: 
      pass 

     return user 

到目前为止,它工作正常。但是,我需要在模板中读取当前记录的用户的后端类。

使用request.user.backenduser没有属性的后端...和(使用request.session._auth_user_backend),因为Django的模板系统抱怨“和属性的变量可能与下划线开头”我无法从会话读取它。

我正在使用django.contrib.auth.views.login来允许用户登录。我错过了什么?

+0

btw此认证方案看起来真的不安全。 – mak 2015-02-08 19:24:00

回答

0

您应该在视图中阅读它,并将该类名称的适当人体形式作为消息发送。当用户认证使用django.contrib.auth.authenticate(username='foo',password='bar')函数

3

backend属性被添加到user对象。

该功能反过来会调用您在settings.py文件中指定的所有AUTHENTICATION_BACKENDS,直到它能够使用其中一个文件成功进行验证。

如果您的用户“已登录”,但没有backend属性,可能意味着您没有正确验证它们。也许你直接打电话给你的SFIUserBackend.authenticate函数,当你应该调用django.contrib.auth.authenticate函数?

查看这些custom authentication docs