django的pysaml2集成

unicef-djangosaml2的Python项目详细描述


==
djangosaml2
==


图片::https://travis-ci.org/knaperek/djangosaml2.svg?branch=master
:target:https://travis ci.org/knaperek/djangosaml2
:align:left



djangosaml2是一个django应用程序,它将pysaml2库集成到您的项目中。这意味着您可以使用基于pysaml的服务提供商来保护基于django的项目。通过这种方式,它将与允许您使用此身份验证机制的身份提供商讨论saml2。
本文档将指导您完成几个简单的步骤来实现这一目标。

内容:

installation
=最终可执行文件安装在哪里并不重要,因为
您需要在配置阶段设置它的完整路径。

_ xmlsec1:http://www.aleksey.com/xmlsec/

这也将自动安装pysaml2及其依赖项。




configuration
==



要使djangosaml2在
django项目中工作,需要设置三件事:

1。**settings.py**如您所知,它是主django
配置文件。
2。**urls.py**是包含djangosaml2 url的文件。
3。**pysaml2**特定文件,如属性映射目录和
证书。




settings.py文件中的更改
--------------------------
首先需要将"djangosaml2"添加到
已安装应用的列表中::

'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.admin',
'djangosaml2',新应用程序

因为djangosaml2不包含任何数据模型,所以是必需的。我们包含它的唯一原因是能够从我们的项目中运行
djangosaml2测试套件,您应该始终这样做以确保它与您的django版本和环境兼容。注意:

完成配置后,可以运行djangosaml2测试套件,就像运行任何其他django应用程序测试套件一样。只需键入"python manage.py
test djangosaml2`.

测试。

后端。
默认情况下,仅配置django中包含的模型后端。
典型配置如下:


身份验证后端=(
"django.contrib.auth.backends.modelbackend",
"djangosaml2.backends.saml2backend",

注意:

djangosaml2 0.5.0之前,djangosaml2自动添加了此身份验证后端。结果证明这是一个坏主意,因为有些应用程序希望使用自己的自定义策略进行授权,而身份验证后端是定义此策略的好地方。从
django saml2 0.5.0开始,现在可以定义这样的
后端。

如果用户之前未对
进行身份验证,则需要经过身份验证的
用户的视图应将用户浏览器重定向到该url。我们还告诉用户,当用户关闭其浏览器时,会话应该终止。这我在saml2
不总是可用注销协议的联合中很有用。

…注意:

作为示例,登录url以`/saml2/`'开头,但如果需要,可以更改该值。查看"url.py"文件中有关更改的部分以获取更多信息。

/``查看。

preferred logout binding
——
使用以下设置为SP启动的注销请求选择首选绑定::


saml_logout_request_preferred_binding

例如::

import saml2
saml_logout_request_preferred_binding=saml2.binding_http_post

--------------------------


>下一步需要做的是在
main``urls.py``模块中包含``djangosaml2.urls``模块::

'',
这里有很多url定义

(r'^saml2/',include('djangosaml2.urls'),

更多url定义



,正如您所看到的,我们在*saml2*
前缀下包含了``djangosaml2.urls`'。请随意使用您自己的前缀,但要与您在login_url参数中放入的"settings.py"文件中的内容保持一致。



必须
开始配置pysaml。如果只使用该库,则必须将配置选项放入一个文件中,并使用该文件的路径初始化pysaml2。


保护django项目的配置:



您的实体ID,通常是您的子域加上元数据视图的URL
"entityID":"http://localhost:8000/saml2/metadata/",

"具有属性映射的目录
"属性映射目录":path.join(basedir,"属性映射"),

#url和对assition consumer service视图的绑定
不要更改绑定或服务名称
"assertion_consumer_service":[
("http://localhost:8000/saml2/acs/",
saml2.binding_http_post),
],
url和绑定到单一注销服务视图
不要更改绑定或服务名称
"单一注销服务":[
('http://localhost:8000/saml2/ls/',
saml2.binding_http_redirect)、
('http://localhost:8000/saml2/ls/post'、
saml2.binding_http_post)、
]、
},

此项目需要标识用户的属性
"必需的属性":["uid"],

"可能有用但不需要的属性"
"可选的属性":["edupersonaffliation"],

e这里只定义了一个idp。这个idp应该
出现在我们的元数据中

saml2.binding廑u http廑redirect:'https://localhost/simplesaml/saml2/idp/ssoservice.php',
},
‘单一登录服务’:{
saml2.binding廑u http廑redirect:'https://localhost/simplesamml/saml2/idp/single logout service.php',
},
},
},
},
},


存储远程元数据的位置
‘元数据’:{
‘本地’:[path.join(basedir,'remote_metadata.xml'),
},

设置为1以输出调试信息
"调试":1,

"签名
"密钥文件":path.join(basedir,'mycert.key'),'private part
"证书文件":path.join(basedir,'mycert.pem'),#公共部分

加密
"加密密钥对":[{
"密钥文件":path.join(basedir,'my_encryption_key.key'),私有部分
"证书文件":path.join(basedir,'my_encryption_cert.pem'),公共部分
},

自己的元数据设置
'联系人':[
{'姓名':'lorenzo',
'姓名':'gil',
'公司':'yaco sistemas',
'电子邮件地址':'lgs@yaco.es',
'联系人类型':'technical',
{'姓名':'angel',
'姓名':'fernandez',
"公司":"Yaco Sistemas",
"电子邮件地址":"Angel@Yaco.es",
"联系人类型":"管理"},
],
"您可以在此处设置多语言信息
"组织":{
"名称":[("Yaco Sistemas","es"),("Yaco系统",‘en’),
‘显示名称’:[(‘yaco’,‘es’,(‘yaco’,‘en’)],
‘url’:[(‘http://www.yaco.es’,‘es’),(‘http://www.yaco.com’,‘en’)],
},
‘有效期:24,’我们的元数据有效期是多长
}

注意:

有关这些和其他配置选项的详细信息,请查看"pysaml2文档"。_` pysaml2文档`:http://pysaml2.readthedocs.io/en/latest/


根据此配置,您必须创建几个外部文件和目录。


在这里,在
配置部分,您只需要将完整路径放到xmlsec1,这样pysaml2
就可以根据需要调用它。

通常
只需复制源发行版的
``tests/attribute maps``目录中的默认pysaml2属性映射就安全了。

``metadata``选项是一个字典,您可以在其中为远程实体定义多种类型的
元数据。通常最简单的类型是"local",其中
只需将本地xml文件的名称与远程
实体元数据的内容放在一起。此XML文件应采用saml2元数据格式。


"密钥文件"和"证书文件"选项引用标准X509证书的两部分。你需要它来签署你的元数据。对于断言
加密/解密支持,请配置另一组"密钥文件"和
"证书文件",但作为"加密密钥对"选项的内部属性。

。注意:

查看OpenSSL文档以生成测试证书,但不要忘记在投入生产时订购一个真正的证书。




………

默认情况下,djangosaml2从
saml_配置设置读取pysaml2配置选项,但有时您希望从
其他位置(如文件或数据库)读取此信息。有时您甚至希望这个
配置根据请求而有所不同。

从djangosaml2 0.5.0开始,您可以定义自己的配置
加载程序,它是一个可调用的程序,接受请求参数并返回一个saml2.config.spconfig对象。为此,您可以设置以下
设置:




成功进行
身份验证后的提供程序(SP)。此断言包含有关已通过身份验证的用户的属性。这取决于idp配置,具体的
属性被发送到它可以与之交谈的每个sp。


当在django端接收到这样的断言时,它被用来查找django
用户并为其创建会话。默认情况下,djangosaml2将使用username\field属性对
用户模型进行查询,但您可以将其更改为用户模型的任何
其他属性。例如,您可以使用
"email"属性进行此查找。为此,应设置以下设置:


…_用户名字段:https://docs.djangoproject.com/en/dev/topics/auth/customization/django.contrib.auth.models.customuser.username\u字段请在设置此选项时使用唯一属性。否则,
身份验证过程可能会失败,因为djangosaml2不知道应该选择哪个django用户。

您可以设置::

saml_django_user_main_attribute_lookup=''uu iexact'

(这只是附加到主属性名中,以形成django
查询。即使进行了此查找,主属性也必须是唯一的。)

另一个选项是使用saml2 name id作为用户名,方法是设置:


saml_use_name_id_as_username=true

也许您不想允许数据库中没有
的用户。为此,可以在settings.py文件中设置另一个选项:


此设置默认为true。


此设置允许您指定重定向的url。在成功的
身份验证之后。当您只计划使用
idp启动的登录并且idp没有配置的relastate
参数时,特别有用。默认值是``/`.


您可能需要配置的另一件事是将
saml2用户属性映射到django用户属性。默认情况下,仅映射
user.username属性,但您可以添加更多属性或更改该属性。为此,您需要更改设置中的
saml_attribute_mapping选项。py:

'uid':('username',),
'mail':('email',),
'cn':('first_name',),
'sn':('last_name',),
}


此字典的键是saml用户属性,值
是django用户属性。

对于每个(键、值)对,djangosaml2将尝试在用户模型中存储
属性(如果该模型中有匹配的字段)。
否则它将尝试对配置文件自定义模型执行相同的操作。对于
多值属性只有第一个值分配给目标字段。

在这种情况下,djangosaml2调用每个方法,
传递从<;saml:attributevalue>;元素中提取的属性值的完整列表。除其他用途外,这是处理多值属性(如用户组名称列表)的有用方法。


例如:

>saml断言片段::

<;saml:attribute name="groups"name format="urn:oasis:names:tc:saml:2.0:attrname format:basic">;
<;saml:attributeValue>;group1<;/saml:attributeValue>;
<;saml:attributeValue>;group2<;/saml:attributeValue>;
<;saml:attributeValue>;group3<;/saml:attributeValue>;
<;/saml:attributeValue>;

自定义用户对象:



settings.py::

'组':('处理组',),
}



有关django配置文件模型的详细信息,请访问:



有时需要使用特殊逻辑来更新用户对象
,具体取决于saml2属性和上面描述的映射
远远不够。对于这些情况,djangosaml2提供了一个django
信号,您可以收听该信号。为此,您可以在应用程序中添加以下代码:


handler将收到user对象、saml属性列表
,以及一个标志,告诉您是否已经修改了用户,并且需要在执行handler之后保存
。如果处理程序
修改用户对象,则应返回true。否则应返回false。这样djangosaml2就知道它是否应该保存用户对象,这样您就不需要这样做了,也就不会再调用save方法了。




idp setup
=您已完成联合的SP端配置。
现在您需要将此新SP的实体ID和元数据发送给
idp管理员,以便他们可以将其添加到受信任服务列表中。

以及
转到http://localhost:8000/saml2/metadata url。如果在不同的url前缀下包含了djangosaml2 url,则需要更正此
url。


simplesamlpp问题
----
从simplesamlpp1.8.2开始,如果在
sp配置中指定属性,则会出现问题。当simplesamlphp元数据解析器将
xml转换为其自定义php格式时,它会放入以下选项:


'attributes.nameformat'=>;'urn:oasis:names:tc:saml:2.0:attrname format:uri'

,但它需要替换为此格式::

'attributename format'=>;'urn:oasis:names:tc:saml:2.0:attrname format:uri'


>否则,从idp发送到sp的断言将具有错误的
属性名称格式,pysaml2将被混淆。


此外,如果在simplesamlpph配置中有attributelimit筛选器,则需要在启用另一个属性过滤器之前,只需
,以确保attributeLimit不会从身份验证源中删除属性
。您需要添加的筛选器是一个属性emap
这样的过滤器:

>10=>;数组(
'class'=>;'core:attributemap','name2oid'
),

测试
=


检查一切是否按预期工作的一种方法是启用以下url:


url patterns=patterns(
'',
这里有很多url定义

(r'^saml2/',include('djangosaml2.url'),
(r"^test/","djangosaml2.views.echo_attributes"),

`安装了tox`,您可以在根目录中调用tox
,它将在多个版本的python中运行测试。_` tox`:http://pypi.python.org/pypi/tox

===

**为什么saml不能实现为django身份验证后端?**

好吧,saml身份验证并不像一组凭证那么简单,您可以将它们放在登录表单上并得到响应。实际上,用户密码根本没有提供给服务提供商。这是故意的。必须将身份验证任务委托给idp,然后从idp获得异步响应。djangosaml2确实使用django身份验证后端来
将有关用户的saml断言转换为django用户对象。

**为什么不将所有内容都放在django中间件类中,让我们的生活更轻松?**

是的,这是我评估过的一个选项,但在最后,当前的设计获胜。在我看来,将此逻辑放入中间件中有一个优点
使其更易于配置,但有两个缺点:首先,
中间件需要检查请求路径是否是每个请求的
saml端点之一。第二,它太神奇了,在
出现问题的情况下,调试起来会困难得多。

**为什么不像其他许多django应用程序那样调用这个包django saml?**

按照该模式,我应该使用
import saml导入应用程序,但不幸的是,模块名已在pysaml2中使用。



重新播放,而不是500。
-由于francoisfreitag、mhindery、vkurup、peppelinux

0.16.11(2017-12-25),对python 3.3的支持被删除
-pysaml2依赖项升级到4.5.0版本

1.8.
-添加了一个clean_attributes挂钩,允许后端重新构造从saml响应中提取的属性。
-当saml响应中缺少字段时记录。
-当attribute_映射映射到不存在的用户字段时记录。
-多个兼容性修复和其他小的改进以及代码清理

非常感谢FrancoisFreitag.

0.16.9(2017-09-19)
----
-错误修复和小改进。感谢goetzk和ambientlighter。
-添加了saml_logout_request_preferred_binding选项
-添加了django 1.11到tox。

>0.16.4(2017-09-11)
----
-添加了对sha-256签名的支持。感谢Webspider。
-错误修复。感谢justinsg和charn。
-错误处理使其更具扩展性。这将在下一版本中进一步改进。

0.16.1(2017-07-15)
----
-错误修复。感谢canni、ambientlighter、cranti和logston。
-请求现在传递到身份验证后端(在django 1中引入)。11)。感谢terite。


0.16.0(2017-04-14)
----
-将pysaml2依赖项升级到4.4.0版本,该版本修复了一些序列化问题。感谢nakato提供的报告。
-添加了对带有签名身份验证请求的http重定向绑定的支持。非常感谢liquidpele提供了此功能和其他相关重构。
-删除了custom permission_denied.html模板,以支持标准permissiondenied异常。感谢mhindery.

0.15.0(2016-12-18)
----
-python 3.5支持。感谢timheap。
-增加了对可调用用户属性的支持。感谢andy miracl和joetsoi。
-安全改进:"下一个"url现在被选中。感谢flupzor。
-提高了可测试性。感谢flupzor。
-其他错误修复和小改进。感谢Jamalskarlett、WS0W、Jaywink和Liquidpele。


0.14.5(2016-09-19)
----
-django 1.10支持。感谢诱导器。
-各种修复和小改进。感谢Ajsmiltin、Ganiserb、归纳剂、Grunichev、Liquidpele和Darbula


0.14.4(2016-03-29)
----
-修复与Pysaml2-4.0.3+的兼容性问题。感谢jimr和astoltz。
-在模板中修复django 1.9兼容性问题。感谢Nikoskal。

0.14.3(2016-03-18)
----
-升级到Pysaml2-4.0.5。
-添加了"ACS默认重定向URL"设置,用于成功验证后的默认重定向。感谢Ganiserb.

0.14.2(2016-03-11)
—————————————————————————————————————————————————————————————————————————————放弃djangosaml2 knaperek fork。

0.14.1(2016-03-09)
----
-升级到pysaml2-4.0.4。


0.14.0(2016-01-28)
----
-升级到pysaml2-4.0.2。感谢kviktor
-django 1.9支持。感谢jordi gutiérrez hermoso

0.13.2(2015-06-24)
---------
-改进了标准python日志记录的使用。


0.13.1(2015-06-05)
---------
-添加了对saml嫒u用户模型设置定义的djangosaml2特定用户模型的支持

0.13.0(2015-02-12)
----
-django 1.7支持。感谢Kamei Toshimitsu的支持。感谢erick tryzelaar

0.11.0(2014-06-15)
----
-django 1.5自定义用户模型支持。感谢jos van velzen
-django 1.5兼容性url模板标记。感谢bula
-支持django 1.5和1.6。感谢david evans和justin quick

0.10.0(2013-05-05)
————————————————————————————————————————————————————————————————————————————感谢Sam Bull报告此问题。
-在全局注销过程中,会话丢失时,向用户报告错误
消息并执行本地注销。


0.9.2(2013-04-19)
----
-升级到pysaml2-0.4.3。


0.9.1(2013-01-29)
----
-向身份验证后端添加方法,以便可以自定义基于saml属性的授权。

0.9.0(2012-10-30)
---------
-在将用户保存到身份验证后端的更新用户方法之前添加一个修改用户的信号。


0.8.1(2012-10-29)
----
-修剪saml属性在将它们设置为django对象之前,如果它们太长。这将修复MySQL的故障。

0.8.0(2012-10-25)
----
-允许使用"用户名"以外的其他属性来查找现有用户。


0.7.0(2012-10-19)
----
-添加一个设置以决定是否应将用户重定向到当用户尝试两次登录时,
下一个视图或显示一个授权错误。


0.6.1(2012-09-03)
----
-rem从依赖项中删除django
-还原对django 1.3的支持

>0.6.0(2012-08-29)
----
-添加配置为使用python 2.6和2.7运行测试的tox支持
-修复一些依赖项和sdist生成。lorenzo gil
-允许在设置中定义注销重定向url。lorenzo gil
-添加一些日志调用以改进调试。lorenzo gil
-添加对自定义配置加载功能的支持。sam bull.
-当djangosaml2包含在django项目中时,使测试更加健壮和易于运行。sam bull.
-保存配置文件之前,请确保它不是none。由
leif johansson

0.5.0(2012-05-22)报告的错误
----
-允许定义自定义配置加载程序。它们可以是动态的,这取决于
请求。
-不要自动添加身份验证后端。通过这种方式,我们允许其他人添加自己的后端。
-支持其他属性,而不是映射到用户模型中的属性。这些属性存储在用户配置文件模型中。

0.4.2(2012-03-23)
---------
-修复idplist templateTag中关于使用旧pysaml2函数的崩溃
-为以前的崩溃添加测试


0.4.1(2012-03-19)
----
-升级pysaml2对0.4.1版的依赖性

0.4.0(2012-03-18)
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————(2012-02-14)
----
-冻结pysaml2的版本,因为我们还没有(还没有!)兼容
0.4.0版

0.3.2(2011-12-13)
----
-读取映射到django的saml属性时避免崩溃
username


0.3.1(2011-12-01)
----
-在idplist templatetag的呈现方法中加载配置使其更加灵活和可重入。


0.3.0(2011-11-30)
----
-获取可用idp列表的模板标记。
-允许将同一saml属性映射到多个django字段。


0.2.4(2011-11-29)
----
-修复重新构造的文本使PYPI页面看起来很糟糕的错误。

0.2.3(2011-06-14)
----
-第一次创建用户时设置不可用的密码


0.2.2(2011-06-07)
----
-在转到/saml2/login/endpoint和用户时防止无限循环
已登录且设置为。login_redirect_url(错误)指向
到/saml2/login。


0.2.1(2011-05-09)
----
-如果没有为登录视图提供下一个参数,使用
settings.login_redirect_url作为默认值


0.2.0(2011-04-26)
----
-如果安装了elementtree库,则与python 2.4兼容
-允许在身份验证阶段之后使用
django信号进行后期处理。

0.1.1(2011-04-18)
---------
-简单的视图来回送saml属性
-改进文档
-在创建新用户时更改默认行为。现在,它们的属性
第一次填充
-允许在注销后设置下一页


0.1.0(2011-03-16)
----
-从pysaml包中解放出来

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用Ibatis在插入时返回ID(使用返回关键字)   java(org.hibernate.TransactionException)org。冬眠TransactionException:事务未成功启动   java小程序jwindow始终位于JNLP顶部   在Java中重新解析JSON对象?   java单击后将ListView数据移动到新屏幕   Mule ESB中的java WSA寻址特性   Java,对象编程:获取返回0值的方法   hibernate的Java通用问题,如何处理T get(K id)   java在使用超级CSV读取CSV时忽略引用   ssh使用Java远程运行命令   java如何向具体用户发送websocket消息?   在JAVA中,我可以在不指定的情况下使用条件运算符吗?