我正在使用 django_openid_auth 库实现 openid 功能,这非常棒。但是我正在寻找非常具体的审核设置。
虽然 openid 可供所有人使用..我希望实施以下规则
- OpenId 应该提供电子邮件地址.. 并非所有人都提供
- 电子邮件地址应该是我的数据库中存在的访问权限列表之一
我开始考虑很可能的方法,比如创建自定义中间件、自定义 login_required 装饰器等。但我无法想出一种可能的方法来完全符合它们的要求。
任何人都可以添加建议将不胜感激
我正在使用 django_openid_auth 库实现 openid 功能,这非常棒。但是我正在寻找非常具体的审核设置。
虽然 openid 可供所有人使用..我希望实施以下规则
我开始考虑很可能的方法,比如创建自定义中间件、自定义 login_required 装饰器等。但我无法想出一种可能的方法来完全符合它们的要求。
任何人都可以添加建议将不胜感激
获取电子邮件地址非常简单——您只需要向 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 或您的设置中指定的 LOGIN_REDIRECT_URL
5)在那个视图之前,所有的中间件和装饰器都被使用了。如果你使用了类似@login_required 装饰器(这对每个登录保护页面来说都是明智的做法),那么它会立即将用户重定向到登录页面。如果您不想在信号中添加某种消息来请求,则会显示该消息(假设您的登录/注销页面支持该消息)
最后说点什么 - 没有比注销更有效的方法了。
/编辑