我使用自定义User
,我为此用户设置了email_verified
字段。
我希望当用户登录时,如果此字段为false
,则会被拒绝。
我无法在views.py
中执行此操作,因为用户可以从各种来源(Django站点,但REST API)登录。
整个目的是避免为N个登录源写入N次逻辑。我想在models.py中覆盖一个方法(login()
?authenticate()
?),只执行一次。
我很快阅读了关于customizing authentication的文档,但没找到我正在寻找的内容。
感谢您的帮助。
答案 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)在您的设置中,无需担心破坏代码。
希望这有帮助。