gpt4 book ai didi

database - Django 用户和来自外部源的身份验证

转载 作者:太空狗 更新时间:2023-10-30 01:39:59 24 4
gpt4 key购买 nike

我有一个 Django 应用程序,它完全从外部源(通过 HTTP 查询)获取数据。也就是说,我没有本地数据库的选项。 session 数据存储在缓存中(在我的开发服务器上,我使用 SQLite 数据库,所以这不是错误源)。我正在使用最新的 Django 1.1svn。

输入问题:我想使用Django自带的用户认证系统。

编写我自己的身份验证后端似乎很简单,但总是前提是你有一个本地数据库来保存用户。没有数据库,我的主要问题是持久性。

我尝试了以下方法(假设 datasource.get() 是一个返回某种字典的函数):

class ModelBackend (object):
"""Login backend."""

def authenticate (self, username=None, password=None):
"""Check, if a given user/password combination is valid"""

data = datasource.get ('login', username, password)
if data and data['ok']:
return MyUser (username=username)
else:
raise TypeError
return None

def get_user (self, username):
"""get data about a specific user"""

try:
data = datasource.get ('userdata', username)
if data and data['ok']:
return data.user
except:
pass
return None


class MyUser (User):
"""Django user who isn't saved in DB"""

def save (self):
return None

但是 MyUser 上故意缺少的 save() 方法似乎破坏了登录的 session 存储。

如果没有本地数据库,MyUser 应该是什么样子?

最佳答案

好吧,这比我想象的要复杂得多。首先,从http://docs.djangoproject.com/en/dev/howto/auth-remote-user/开始,但您需要使用自己的后端和用户对其进行扩展。

from django.contrib.auth.backends import RemoteUserBackend

class MyRemoteUserBackend (RemoteUserBackend):
# Create a User object if not already in the database?
create_unknown_user = False

def get_user (self, user_id):
user = somehow_create_an_instance_of (MyUser, user_id)
return user

def authenticate (self, **credentials):
check_credentials ()
user = somehow_create_an_instance_of (MyUser, credentials)
return user

然后用户:

from django.contrib.auth.models import User

class MyUser (User):

def save (self):
"""saving to DB disabled"""
pass

objects = None # we cannot really use this w/o local DB

username = "" # and all the other properties likewise.
# They're defined as model.CharField or similar,
# and we can't allow that

def get_group_permissions (self):
"""If you don't make your own permissions module,
the default also will use the DB. Throw it away"""
return [] # likewise with the other permission defs

def get_and_delete_messages (self):
"""Messages are stored in the DB. Darn!"""
return []

呸! Django 真的不是为没有数据库的使用而设计的......

关于database - Django 用户和来自外部源的身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1057149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com