我正在使用django_openid_auth库实现openid功能,这非常了不起.. 但是,我正在寻找非常具体的审核设置。
虽然openid可供所有人使用..我希望实施以下规则
我开始想到很多可能的方法,比如创建自定义中间件,自定义login_required装饰器等等。但是我无法想出一种可能的方法来完全适合它们。
任何人都可以添加建议将不胜感激
答案 0 :(得分:1)
获取电子邮件地址非常简单 - 您只需要向openid服务器询问即可。 django-openid-auth为它提供了设置:
OPENID_SREG_EXTRA_FIELDS = ['email']
在我的项目中,我还需要在身份验证后做额外的事情。我用信号解决了它:
def register_login_signal():
from django.contrib.auth.signals import user_logged_in
from django.contrib.auth.models import User
user_logged_in.connect(your_function_name_here, sender = User)
def your_function_name_here(sender, **kwargs):
request = kwargs.get('request')
logout(request) if request.user.email not in your_list_of_authenticated_emails else pass
并且不要忘记将register_login_signal()放到某个地方,比如项目 init .py文件
修改:
第一条评论/问题。
额外字段部分未在文档中说明。此外,如果你扫描github包然后你没有注意到它,我敢肯定。我使用的是https://pypi.python.org/pypi/django-openid-auth/0.5的旧版本。在django-openid-auth文件夹中下载,解压缩并打开views.py.搜索OPENID_SREG_EXTRA_FIELDS,你会看到它。如果你在settings.py中定义它就像魅力一样。
第二个问题
异步?不,不是真的。异步会在当前函数堆栈之外运行 - 如果你可以这样描述的话。这不是那样的。想象一下 - 在登录功能结束时有检查,如果在登录功能结束时挂起了一些功能。他们立刻就跑了。它与django中间件一样多。所以一点也不。
但它是否适合这样做?我想你已经设置了你的站点,你检查用户是否已经使用@login_required装饰器登录 - 或类似的东西。
让我们看看事情将如何执行:
1)您的openid服务器会向您发送上次请求所请求的所有信息
2)你的django-openid-auth login_complete视图接管并使用它的后端验证用户
3)在该过程结束时,将触发您收听的信号,根据您的列表检查用户的电子邮件,如果检查失败,则他会立即退出。
4)由于视图已完成,它会自动将您重定向到原始视图中使用“next”参数指定的url whcih或设置中指定的LOGIN_REDIRECT_URL
5)在该视图之前,所有中间件和装饰器都会被使用。如果您使用过类似@login_required的装饰器(这对于每个登录受保护的页面都是明智的事情),那么它会立即将用户重定向到登录页面。如果您不愿意在信号中添加某种消息来请求,则会显示该消息(假设您的登录/注销页面支持该消息)
最后说些什么 - 没有比登出更强大的方法。
<强> /修改