Django的SAML 2.0身份验证
项目描述
django-mellon
Django的SAML 2.0身份验证
用法
您需要安装Lasso库的Python绑定,您可以在http://lasso.entrouvert.org/download/找到Debian的源和包。
将mellon添加到已安装的应用中
INSTALLED_APPS = ( ... 'mellon', )
将SAMLBacked添加到您的身份验证后端
AUTHENTICATION_BACKENDS = ( ... 'mellon.backends.SAMLBackend', )
将mellon urls添加到您的urls
urlpatterns = patterns('', ... url(r'^/accounts/mellon/', include('mellon.urls')), )
请注意,从django 3.2开始,注册的AdminSite应用包含一个URL路由捕获所有选项(AdminSite.final_catch_all_view),该选项默认激活,并且可能会与在mellon的url路由之前声明的django-mellon应用冲突。
如果SAML 2.0应该是您唯一的身份验证方法,您可以将mellon_login定义为主要的LOGIN_URL
LOGIN_URL = 'mellon_login' LOGOUT_URL = 'mellon_logout'
您的元数据可以通过以下HTTP地址下载:
如果您的身份提供者要求您的断言消费者URL,它是在
如果您的身份提供者要求您的注销URL,它是在
会话
身份验证后,将身份验证属性存储在会话中,使用字典,键是mellon_session。该字典包含
issuer:身份提供者的EntityID
name_id_content:NameID的值
name_id_format:NameID的格式
authn_instant:在身份提供者上的身份验证的ISO8601日期,可选。
session_not_on_or_after:在本地会话应关闭的ISO8691日期之后。请注意,如果我们有此值,我们将自动将Django会话的过期时间设置为该值。
authn_context_class_ref:在身份提供者上当前身份验证的身份验证方法。您可以使用设置MELLON_AUTHN_CLASSREF来限制授权的身份验证方法。
从断言中提取的所有属性。
设置
除MELLON_IDENTITY_PROVIDERS之外的所有通用设置都可以通过移除MELLON_前缀在身份提供者设置中覆盖。
MELLON_IDENTITY_PROVIDERS
字典列表,它们必须包含至少一个键:METADATA(身份提供者元数据的内联副本),METADATA_URL身份提供者元数据文件的URL,或METADATA_PATH身份提供者元数据文件的绝对路径。所有其他键都是通用设置的覆盖。
当使用URL时,URL将自动缓存在应用程序的MEDIA_ROOT目录下的mellon_metadata_cache目录中。如果您重新启动应用程序且URL不可用,将使用文件缓存。缓存将在每MELLON_METADATA_CACHE_TIME秒刷新一次。如果HTTP检索元数据URL的时间超过MELLON_METADATA_HTTP_TIMEOUT秒,则跳过检索。
当缓存已加载时,检索将由线程在后台完成。
当使用本地绝对路径时,如果文件的修改时间高于上次加载时的时间,则每次都会重新加载元数据。
MELLON_PUBLIC_KEYS
此服务提供者的公钥列表,添加多个密钥以进行密钥轮换。
MELLON_PRIVATE_KEY
PKCS#8 PEM编码的私钥。如果未设置MELLON_PRIVATE_KEYS和MELLON_PRIVATE_KEY,则请求将不会被签名。
MELLON_PRIVATE_KEY_PASSWORD
如果需要,私钥的密码,默认为None。
MELLON_PRIVATE_KEYS
包含在字符串中(与MELLON_PRIVATE_KEY相同格式)或元组对(private_key, private_key_password)中的私钥列表。如果MELLON_PRIVATE_KEY为None,则将使用MELLON_PRIVATE_KEYS中的第一个密钥来签名消息。其他密钥仅用于解密加密断言。如果在MELLON_PRIVATE_KEY和MELLON_PRIVATE_KEYS中相同密钥出现两次,则第二次将忽略。如果未设置MELLON_PRIVATE_KEYS和MELLON_PRIVATE_KEY,则请求将不会被签名。
MELLON_NAME_ID_FORMATS
在元数据文件中宣传的NameID格式,默认为()。
MELLON_NAME_ID_POLICY_FORMAT
请求的NameID格式,默认为None。
MELLON_FORCE_AUTHN
是否在每个身份验证请求上强制执行身份验证,默认为False。
MELLON_ADAPTER
提供处理SAML授权、用户查找和配置方法类的列表。这些类上的可选方法包括
authorize(idp, saml_attributes) -> boolean
如果任何适配器返回False,则拒绝身份验证。可以抛出PermissionDenied来在登录界面显示特定消息。
lookup_user(idp, saml_attributes) -> User / None
按照设置的顺序调用每个适配器,保留第一个非None的返回值作为已验证用户。
provision(user, idp, saml_attributes -> None
此方法可用于用SAML属性中的数据填充现有用户字段,或在应用程序中提供任何类型的对象。
默认适配器的设置
以下设置由默认适配器mellon.adapters.DefaultAdapter使用,如果您使用自己的适配器,则可以忽略它们。如果您的适配器继承自默认适配器,则这些设置仍然适用。
MELLON_REALM
与默认适配器创建的用户关联的默认领域,默认为‘saml’。
MELLON_PROVISION
如果用户的用户名不存在,是否创建用户,默认为True。
MELLON_USERNAME_TEMPLATE
根据接收到的属性构建和/或从其用户名检索用户的模板,语法是Python的str.format()方法的语法。可用的变量有
realm
idp(发出声明的idp的当前设置)
attributes
默认值是{attributes{name_id_content]}@realm。
另一个示例可以是{atttributes[uid][0]},以将传递的用户名设置为新创建用户的用户名。
MELLON_ATTRIBUTE_MAPPING
根据SAML属性将模板映射到用户模型的字段。默认为{}。例如,要将标准LDAP属性复制到Django用户模型中,可以这样操作
MELLON_ATTRIBUTE_MAPPING = { 'email': '{attributes[mail][0]', 'first_name': '{attributes[gn][0]}', 'last_name': '{attributes[sn][0]}', }
MELLON_SUPERUSER_MAPPING
如果SAML属性包含特定值,将超级用户标志属性分配给用户。默认为{}。例:
MELLON_SUPERUSER_MAPPING = { 'roles': 'Admin', }
MELLON_AUTHN_CLASSREF
授权的认证类引用,默认为()。空值表示一切都被授权。认证类引用必须从您的身份提供者获取,但应来自SAML 2.0规范。
MELLON_GROUP_ATTRIBUTE
要将SAML属性映射到Django组名的SAML属性名称,默认为None。例:
MELLON_GROUP_ATTRIBUTE = 'role'
MELLON_CREATE_GROUP
是否创建组或仅分配现有组,默认为True。
MELLON_ERROR_URL
认证失败时继续链接的URL,默认为None。如果ERROR_URL不为空,则使用RelayState。如果没有RelayState,则使用默认的LOGIN_REDIRECT_URL(默认为/)。
MELLON_ERROR_REDIRECT_AFTER_TIMEOUT
在认证失败后自动将用户重定向到继续URL之前的时间(秒)。默认为120秒。
MELLON_VERIFY_SSL_CERTIFICATE
在执行HTTP请求时验证SSL证书,用于解析工件。默认为True。
MELLON_TRANSIENT_FEDERATION_ATTRIBUTE
当NameID格式为临时时,用于替换NameID内容的属性名称。如果没有它,则默认适配器无法使用临时NameID进行登录。默认为None。
MELLON_DEFAULT_ASSERTION_CONSUMER_BINDING
应为post或artifact。默认为post。您可以参考SAML 2.0规范了解区别。
MELLON_LOOKUP_BY_ATTRIBUTES
如果收到的NameID仍然未知,允许根据一些SAML属性查找用户。它必须是一个包含两个必填键(user_field和saml_attribute)的字典列表。可选键ignore-case应是一个布尔值,表示匹配是否不区分大小写(默认为尊重大小写)。
每个字典都是链接规则,应用所有规则应仅返回一个用户,规则之间应用布尔运算符OR。
例如,如果您收到一个名为email的SAML属性,并且您想链接具有相同电子邮件的用户,则可以这样配置
MELLON_LOOKUP_BY_ATTRIBUTES = [ { 'saml_attribute': 'email', 'user_field': 'email', } ]
目标用户(s)字段应尽可能唯一,如果不是,django-mellon将拒绝链接多个符合规则的用户。
MELLON_METADATA_CACHE_TIME
当使用METADATA_URL引用元数据文件时,这是元数据文件刷新之间的持续时间(秒)。默认为3600秒,1小时。
MELLON_METADATA_HTTP_TIMEOUT
检索元数据文件时HTTP调用的超时时间(秒)。默认为10秒。
MELLON_ASSERTION_CONSUMER_BINDINGS
支持的断言消费者绑定列表。默认为
['post', 'artifact']
测试
单元测试使用pytest编写,并使用tox启动,可以使用以下命令运行
tox
代码风格
使用black格式化代码,使用以下参数
black –target-version py37 –skip-string-normalization –line-length 110
存在.pre-commit-config.yaml以使用pre-commit在提交之前自动运行black。(执行pre-commit install安装git钩子。)
isort用于格式化导入,使用以下参数
isort –profile black –line-length 110
pyupgrade用于自动升级语法,使用以下参数
pyupgrade –keep-percent-format –py37-plus
djhtml用于自动缩进HTML文件,使用以下参数
djhtml –tabwidth 2
django-upgrade用于自动升级Django语法,使用以下参数
django-upgrade –target-version 3.2
存在.pre-commit-config.yaml以使用pre-commit在提交之前自动运行这些工具。(执行pre-commit install安装git钩子。)
备注
为了尊重IdP发送的SessionNotOnOrAfter属性,您必须使用特定的SessionEngine,目前仅支持db和cached_db,等效的会话引擎包括
mellon.sessions_backends.db
和
mellon.sessions_backends.cached_db
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码分发
构建分发
django-mellon-1.55.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 96de0752636436e3af401e312df643663f2d36fb258e54508ca21bcca6744204 |
|
MD5 | 3a2757ee6035423c4b11e8bf68490bab |
|
BLAKE2b-256 | da108e12855e1f7c2cea42098bfc65ef6d4f44e69d02ba86a1c324f86d5dc3d0 |
django_mellon-1.55-py3-none-any.whl的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | acc4546caed001a6cb1a1c8e27cba4fde820f6d1e89ef87b84eb358965f3660e |
|
MD5 | fb2d6a2b38ec70a801883ddd6425bd08 |
|
BLAKE2b-256 | 4b28d50f9528755a57e2effee33f530410239821974130ce8364f606f960ab8f |