django中多租户的pysaml2集成

djangosaml2_tenant的Python项目详细描述


…内容:djangosaml2租户是djangosaml2的一个分支,它为租户添加了处理功能。

本文档将指导您完成几个简单的步骤来实现此目标。





断言,因此需要通过操作系统包或编译源代码来安装
。最终可执行文件安装在哪里并不重要,因为
您需要在配置阶段设置它的完整路径。

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

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




configuration
==



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

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




更改设置。py文件
--------------------------
首先需要做的是将"djangosaml2"添加到
已安装的应用列表中::

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

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

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

,然后必须将djangosaml2.backends.saml2backend
身份验证后端添加到身份验证后端列表中。
默认情况下,只配置了django中包含的模型后端。
典型的配置如下就像这样:

authentication_backends=(
'django.contrib.auth.backends.modelbackend',
'djangosaml2.backends.saml2backend',



……注意:

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


最后,我们必须告诉django我们要使用的新登录url是什么:


login戡url='/saml2/login/'
session戡expire戡at戡browser戡close=true

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

。注意:

但是如果你想的话,你可以改变它。查看"url.py"文件中有关更改的部分以获取更多信息。

/``查看。



urls.py文件中的更改
--------------


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


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

请随意使用您自己的前缀,但要与您在login_url参数中放入的"settings.py"文件中的内容保持一致。



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


保护django项目的配置:

通常,您的子域加上指向元数据视图的url
"entityid":"http://localhost:8000/saml2/metadata/",

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

"此块说明我们提供的服务
"服务":{
"我们只是一个孤独的sp
"sp":{
"名称":"联合django示例sp",
"名称id"格式:saml2.saml.nameid"格式持久,
"终结点":{
"url并绑定到assetion使用者服务"查看
不要更改绑定或服务名称
"断言消费者服务":[
('http://localhost:8000/saml2/acs/',
saml2.binding\u http\u post),
],
url和绑定到"单一注销服务"视图,不要更改绑定或服务名称
"单一注销服务":[
("http://localhost:8000/saml2/ls/",
saml2.binding\u http\u redirect),
],
('http://localhost:8000/saml2/ls/post',
saml2.binding\u http\u post),
],
},

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

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

saml2.binding_http廑u redirect:'https://localhost/simplesaml/saml2/idp/ssoservice.php',
},
"单点注销服务":{
saml2.binding\u http戡redirect:'https://localhost/simplesaml/saml2/idp/single logout service.php',
},
},
},
},




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

"mycert.key"),私有部分
"证书文件":path.join(basedir,'mycert.pem'),公共部分

自己的元数据设置
"联系人":[
{"给定名称":"lorenzo",
"sur用户名":"gil",
"公司":"yaco sistemas",
'电子邮件地址':'lgs@yaco.es',
'联系人类型':'technical'},
{'给定名称':'angel',
'附加名称':'fernandez',
'公司':'yaco sistemas',
'电子邮件地址':'angel@yaco.es',
'联系人类型':'administrative'},
],
您可以在此处设置多语言信息
"组织":{
"名称":[("yaco sistemas","es"),("yaco systems","en"),
"显示名称":[("yaco","es"),("yaco","en"),
"url":[("http://www.yaco.es","es"),('http://www.yaco.com','en')],
},
'有效的":24",我们的元数据有效的时间是多久
}


…注意:

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


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


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

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

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


"密钥文件"和"证书文件"选项引用标准x509证书的两部分。您需要它对元数据进行签名并对saml2断言进行加密和解密。注意:

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




djangosaml2从
saml_config设置读取pysaml2配置选项,但有时您希望从
另一个位置(如文件或数据库)读取此信息。有时您甚至希望这个
配置根据请求而有所不同。

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




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

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


saml_django_user_main_attribute='email'

请在设置此选项时使用唯一属性。否则,身份验证过程将失败,因为django saml2不知道它应该选择哪个django用户。


如果该用户不在django数据库中,或者您可能不希望允许数据库中没有
的用户。为此,可以在settings.py文件中设置另一个选项:


默认情况下,此设置为true。

默认情况下,仅映射
user.username属性,但您可以添加更多属性或更改该属性。为此,您需要更改设置中的
saml_attribute_mapping选项。py:

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


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

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

了解有关django配置文件模型的更多信息在:

https://docs.djangoproject.com/en/dev/topics/auth/存储有关用户的附加信息



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


djangosaml2.signals import pre_user_save

def custom_update_user(sender=user,attributes=attributes,user_modified=user_modified)

返回true;我修改了user对象



如果处理程序
修改用户对象,则应返回true。否则应返回false。这样djangosaml2就知道它是否应该保存用户对象,这样您就不需要这样做了,也就不会再调用save方法了。




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

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

----
自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不会从身份验证源中删除属性
。需要添加的筛选器是attributemap
这样的筛选器::

10=>;数组(
"类"=>;"核心: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中已经使用了模块名。



==


<0.20.0(2015-02-12)
----
-基于djangosaml2支持的初始版本多租户

0.20.1(2016-04-06)
-使djangosaml2租户支持从数据库中读取元数据,方法是将以下内容添加到设置中。py:
saml_config.update({
#租户/模型/成员。获取元数据(self)
实现此方法以从所选表中检索元数据。
"元数据":{
"内联":"db",
},

})


0.22.0(2016-08-29)
-删除了从数据库模型tenant.member加载元数据的逻辑。使用此应用程序的项目可以使用saml_config_loader设置指定自己的配置加载器。此更改在从任何数据源加载配置方面提供了更大的灵活性。
-此外,还按照上述相同逻辑删除了服务提供程序配置对象的缓存。使用此应用程序的单个
项目可以使用自己的配置加载器来处理缓存方案。

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

推荐PyPI第三方库


热门话题
Java类之间并发性不一致的HashMap   插件如何在JavaSwing中使用UIManager和Classloader从外部jar安装外观?   java JasperReports:找不到子报表   在项目中找不到java生成的Javadoc文件   java BigDecimal。multiply()和divide()方法返回十六进制数。为什么?   java统计出现次数并从字符串中删除重复项   调用运算符时发生java NullPointerException   Spring和Hibernate之间的java配置错误   JavaZK将用户重定向回上一页   Javasocket为传出连接指定特定的网络接口   如果拖动到某个区域外,java Make按钮操作将被取消   如何在Eclipse for selenium 3.141.59中添加Java文档链接   java从匹配条件的数组中获取所有索引   docker未连接到RemoteWebDriver的java Gitlab ci selenium测试   java重写run方法   utf 8如何使用java解码UTF8编码的字符串?   java如何从eclipse调试部署在tomcat上的web应用程序?   将字母字符与前面没有百分号的Java正则表达式匹配