Django与Shibboleth
我正在研究在Django项目中使用Shibboleth的选项。从我找到的信息来看,相关资料似乎不太多。有没有人能对以下问题发表一下看法?
有没有人使用过django_shibboleth这个模块(可以查看http://code.arcs.org.au/gitorious/django/django-shibboleth/trees/1.1)?如果有的话,你们使用这个模块的体验如何?
关于Django的SAML 2实现(比如django-saml2-sp)和Python的一般实现(比如pysaml2)似乎都还在实验阶段,文档也很少。有没有人知道Django/Python中稳定的SAML 2解决方案?
提前感谢大家的帮助!
3 个回答
有一个叫做 django-shibboleth
的模块,可以用来从身份提供者(IdP)获取用户信息,并把这些信息映射到Django的用户系统里。大部分工作都是由Shibboleth来完成的,我们只需要写一点代码来进行映射。
首先,按照Shibboleth的说明,设置好你本地的Shibboleth服务提供者(SP),以便与身份提供者(IdP)一起使用。
在http.conf文件或者你自己应用的conf.d配置中,添加以下内容。
<Location /shibboleth>
AuthType shibboleth
ShibRequireSession On
ShibUseHeaders On
require valid-user
</Location>
这样设置后,访问/shibboleth的链接会被引导到身份提供者的登录页面。登录成功后,会返回一个404页面。
接着,添加配置时,把app替换成你应用的名字。
<Location "/">
SetHandler mod_python
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE app.settings
PythonDebug Off
</Location>
在通过/shibboleth链接登录后,应该会出现以下错误信息: 当前的URL,Shibboleth.sso/ADFS,没有匹配到任何内容。
要解决这个问题,你需要在配置中添加以下内容。
<Location /Shibboleth.sso>
SetHandler None
</Location>
/var/log/shibboleth/transaction.log
文件应该会告诉你哪些用户信息被释放了。
虽然我没有使用Django和Shibboleth的经验,但我对“普通”的Shibboleth有一些了解。
如果你的Apache服务器已经正确配置了mod_shibboleth,那么把它和一个网页应用结合起来其实很简单。你可以看看django_shibboleth这个模块,里面的代码并不多。
特别是,如果你已经在运行mod_shibboleth,就不要使用第三方的SAML 2库。那些会增加很多不必要的复杂性。
我建议使用Shibboleth的本地服务提供者(apache mod_shib)。这个工具经过了很多测试,用户也很多,稳定性很好。
我简单看了一下django_shibboleth这个模块,发现它依赖于mod_shib,并且自己并不处理SAML。这意味着这个模块非常简单,应该能很好地工作。
我之前没有看到任何完整(或者基本完整)的Python SAML2实现,也没有哪个是活跃的项目。在Python中处理XML安全和加密要求比较麻烦,这可能是缺少相关库的原因。
[编辑 - 我要收回部分说法] pysaml2库有一些开发活动,从表面上看也算比较完整。它直接使用xmlsec1这个工具来处理签名和加密,因此不依赖任何过时的绑定。目前在Python中直接使用SAML2,这可能是你最好的选择。