我正在使用Django的自定义身份验证后端(运行couchdb).我有一个自定义用户模型.
作为登录的一部分,我正在做一个request.user = user并在会话中保存用户ID.但是,在后续请求中,我无法检索request.user.它始终是AnonymousUser.但是,我可以从会话中检索用户ID,并确认正确设置了会话cookie.
我错过了什么?
我不想使用关系数据库,因为我想在couchdb中维护我的所有用户数据.
编辑:我写了一个不从Django的auth用户继承的类.但它具有用户名和电子邮件属性.出于这个原因,我的后端不会返回一个派生自auth User的类.
dge*_*gel 13
由... request.user设定django.contrib.auth.middleware.AuthenticationMiddleware.
检查django/contrib/auth/middleware.py:
class LazyUser(object):
def __get__(self, request, obj_type=None):
if not hasattr(request, '_cached_user'):
from django.contrib.auth import get_user
request._cached_user = get_user(request)
return request._cached_user
class AuthenticationMiddleware(object):
def process_request(self, request):
request.__class__.user = LazyUser()
return None
Run Code Online (Sandbox Code Playgroud)
然后看看get_user函数django/contrib/auth/__init__.py:
def get_user(request):
from django.contrib.auth.models import AnonymousUser
try:
user_id = request.session[SESSION_KEY]
backend_path = request.session[BACKEND_SESSION_KEY]
backend = load_backend(backend_path)
user = backend.get_user(user_id) or AnonymousUser()
except KeyError:
user = AnonymousUser()
return user
Run Code Online (Sandbox Code Playgroud)
您的后端需要实现该get_user功能.
我也有自定义身份验证后端,并且总是AnonymousUser在成功进行身份验证和登录后得到。我get_user在后端有方法。我所缺少的是get_user必须只吸引用户pk,而不是通过电子邮件或您使用的任何凭据authenticate:
class AccountAuthBackend(object):
@staticmethod
def authenticate(email=None, password=None):
try:
user = User.objects.get(email=email)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
@staticmethod
def get_user(id_):
try:
return User.objects.get(pk=id_) # <-- tried to get by email here
except User.DoesNotExist:
return None
Run Code Online (Sandbox Code Playgroud)
很容易在文档中错过这一行:
get_user方法采用一个user_id(可以是用户名,数据库ID或其他名称,但必须是User对象的主键),并返回User对象。
碰巧这email不是我的架构中的主键。希望这可以节省一些时间。
请详细说明。如果您使用自定义用户模型(与自定义用户配置文件模型不同),那么您基本上只能靠自己,django.contrib.auth 框架无法帮助您进行身份验证。如果您正在编写自己的身份验证系统并且没有使用 django.contrib.auth,那么您需要将其关闭,因为它似乎会干扰您的系统。
| 归档时间: |
|
| 查看次数: |
22262 次 |
| 最近记录: |