Django:如何覆盖authenticate()方法?

时间:2014-12-29 00:19:35

标签: python django django-authentication

我使用自定义User,我为此用户设置了email_verified字段。 我希望当用户登录时,如果此字段为false,则会被拒绝。

我无法在views.py中执行此操作,因为用户可以从各种来源(Django站点,但REST API)登录。 整个目的是避免为N个登录源写入N次逻辑。我想在models.py中覆盖一个方法(login()authenticate()?),只执行一次。

我很快阅读了关于customizing authentication的文档,但没找到我正在寻找的内容。

感谢您的帮助。

1 个答案:

答案 0 :(得分:6)

请参阅Django Doc:Writing an authentication backend,这可能就是你所追求的。它涵盖了正常登录的用例和令牌身份验证等REST API:

The authenticate method takes credentials as keyword arguments. 
Most of the time, it’ll just look like this:

class MyBackend(object):
    def authenticate(self, username=None, password=None):
        # Check the username/password and return a User.
        ...
But it could also authenticate a token, like so:

class MyBackend(object):
    def authenticate(self, token=None):
        # Check the token and return a User.
        ...
Either way, authenticate should check the credentials it gets, 
and it should return a User object that matches those credentials, 
if the credentials are valid. If they’re not valid, it should return None.

编写自定义身份验证后端后,您只需更改settings.py中的默认身份验证后端即可:

AUTHENTICATION_BACKENDS = ('project.path.to.MyBackend',)

更新

您可以在设置中同时包含两个后端,而不是覆盖默认的authenticate行为,例如:

AUTHENTICATION_BACKENDS = ('project.path.to.MyBackend',
                           'django.contrib.auth.backends.ModelBackend',)

后端的顺序很重要,您可以阅读源代码并更好地了解默认authenticate和事物如何协同工作(Read here

AFAIK这是自定义authenticate的首选方式,因为您有一天可能会将默认后端更改为RemoteUserBackend或其他任何内容(例如来自RestFramework),因此您可以按顺序放置逻辑(MyBackend)在您的设置中,无需担心破坏代码。

希望这有帮助。