如何适度django openid auth

时间:2013-12-12 12:24:35

标签: django openid django-authentication django-authopenid

我正在使用django_openid_auth库实现openid功能,这非常了不起.. 但是,我正在寻找非常具体的审核设置。

虽然openid可供所有人使用..我希望实施以下规则

  • OpenId应提供电子邮件地址..并非所有人都提供
  • 电子邮件地址应该是我的数据库
  • 中出现的访问权限列表之一

我开始想到很多可能的方法,比如创建自定义中间件,自定义login_required装饰器等等。但是我无法想出一种可能的方法来完全适合它们。

任何人都可以添加建议将不胜感激

1 个答案:

答案 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的装饰器(这对于每个登录受保护的页面都是明智的事情),那么它会立即将用户重定向到登录页面。如果您不愿意在信号中添加某种消息来请求,则会显示该消息(假设您的登录/注销页面支持该消息)

最后说些什么 - 没有比登出更强大的方法。

<强> /修改