django的saml 2.0身份提供程序

djangosaml2idp的Python项目详细描述


djangosaml2idp

PyPiPythonDjangoDocumentation StatusApache 2.0 License

djangosaml2idp为django实现saml2协议的身份提供者端。 它构建在PySAML2之上,并且可以投入生产。

包版本0.3.3是最后一个与Python2/django 1.8-1.11兼容的版本。从0.4.0开始的版本适用于python 3和django 2.x。

任何贡献,功能要求,建议,想法…欢迎!有关一些信息,请参见CONTRIBUTING document

安装

pysaml2使用XML Security Library二进制文件对saml断言进行签名,因此需要安装 它可以通过操作系统包,也可以通过编译源代码。最终可执行文件安装在哪里并不重要,因为 您需要在配置阶段设置到它的完整路径。xmlsec(至少)可用于debian、osx和alpinlinux。

现在可以使用pip安装djangosaml2idp包。这也将自动安装pysaml2及其依赖项:

pip install djangosaml2idp

配置和使用

您需要做的第一件事是将djangosaml2idp添加到已安装的应用程序列表:

INSTALLED_APPS = (
    'django.contrib.admin',
    'djangosaml2idp',
    ...
)

现在将djangosaml2idp添加到url配置中,将其包括在项目中:

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^idp/', include('djangosaml2idp.urls')),
    url(r'^admin/', admin.site.urls),
    ...
]

在django设置中,配置idp。配置遵循PySAML2 configuration。示例项目中的idp如下所示:

...
import saml2
from saml2.saml import NAMEID_FORMAT_EMAILADDRESS, NAMEID_FORMAT_UNSPECIFIED
from saml2.sigver import get_xmlsec_binary

LOGIN_URL = '/login/'
BASE_URL = 'http://localhost:9000/idp'

SAML_IDP_CONFIG = {
    'debug' : DEBUG,
    'xmlsec_binary': get_xmlsec_binary(['/opt/local/bin', '/usr/bin/xmlsec1']),
    'entityid': '%s/metadata' % BASE_URL,
    'description': 'Example IdP setup',

    'service': {
        'idp': {
            'name': 'Django localhost IdP',
            'endpoints': {
                'single_sign_on_service': [
                    ('%s/sso/post' % BASE_URL, saml2.BINDING_HTTP_POST),
                    ('%s/sso/redirect' % BASE_URL, saml2.BINDING_HTTP_REDIRECT),
                ],
            },
            'name_id_format': [NAMEID_FORMAT_EMAILADDRESS, NAMEID_FORMAT_UNSPECIFIED],
            'sign_response': True,
            'sign_assertion': True,
        },
    },

    'metadata': {
        'local': [os.path.join(os.path.join(os.path.join(BASE_DIR, 'idp'), 'saml2_config'), 'sp_metadata.xml')],
    },
    # Signing
    'key_file': BASE_DIR + '/certificates/private.key',
    'cert_file': BASE_DIR + '/certificates/public.cert',
    # Encryption
    'encryption_keypairs': [{
        'key_file': BASE_DIR + '/certificates/private.key',
        'cert_file': BASE_DIR + '/certificates/public.cert',
    }],
    'valid_for': 365 * 24,
}

注意,配置要求文件系统上有一个私钥和公共证书,以便对消息进行签名和加密。

您还必须为与之交谈的每个SP定义一个映射:

...
SAML_IDP_SPCONFIG = {
    'http://localhost:8000/saml2/metadata/': {
        'processor': 'djangosaml2idp.processors.BaseProcessor',
        'attribute_mapping': {
            # DJANGO: SAML
            'email': 'email',
            'first_name': 'first_name',
            'last_name': 'last_name',
            'is_staff': 'is_staff',
            'is_superuser':  'is_superuser',
        }
    }
}

这就是IDP配置的全部内容。假设您在localhost:8000上运行django开发服务器,那么您可以通过访问http://localhost:8000/idp/metadata/获取其元数据。 使用此元数据XML配置您的SP。将来自该SP的元数据XML放在config dict中指定的位置(上面示例中的sp_metadata.xml)。

更多可选配置选项

SAML_IDP_SPCONFIG设置中,您可以定义一个processor,它的值是一个带有指向类的虚线路径的字符串。 这是一个钩子,用于自定义一些访问控制检查。默认情况下,使用包含的baseprocessor,允许每个用户登录idp。 您可以通过子类化baseprocessor并重写其has\u access(self,request)方法自定义此行为。此方法应返回true或false,具体取决于用户是否有权登录sp/idp。 处理器的sp entity id可用作self.\u entity\u id,并接收请求(带有经过身份验证的请求。用户)作为has\u access函数的参数。 这样,你应该有必要的灵活性来执行你需要的任何检查。 示例processor subclass可以在包含的示例的idp中找到。

如果没有自定义设置,用户将由您使用的用户模型上的USERNAME_FIELD属性标识。按django默认值,这将是用户名。 通过将SAML_IDP_DJANGO_USERNAME_FIELD添加到设置中,并将属性作为值用于用户实例,可以自定义用于标识符的字段。

自定义错误处理

如果遇到错误,djangosaml2idp将呈现一个非常基本的错误页,指示发生了错误、发生了哪个错误,可能还会显示一条额外的消息。 如果可能,还将根据发生的错误设置http状态代码。 您可以使用SAML_IDP_ERROR_VIEW_CLASS设置自定义此设置。将此设置为自定义(基于类)视图的点式导入路径,以便使用该视图。 如果将提供的djangosaml2idp.error\views.samlidperrorview子类化,则可以在模板中使用以下变量:

异常类型
发生的异常的类
异常消息
来自异常的消息(通过执行除外))
附加信息
如果没有给出特定的异常,则会出现一条指示出错的消息,或在异常消息旁边出现一条附加消息

最简单的重写是将samlidperrorview子类化,并且只使用您自己的错误模板。 您可以为此使用任何基于类的视图;不必对内置错误视图进行子类化。 示例项目包含一个现成的示例;取消注释saml_idp_error_view_class设置,它将使用带有自定义模板的自定义视图。

多因素身份验证支持

增加多因素支持有三个主要组成部分。

  1. 如上所述的djangosaml2idp.processors.baseprocessor子类。您需要重写enable_multifactor()方法来检查是否应该为用户启用multifactor。(如果所有用户都应该启用它,那么只需将硬代码设置为true)。默认情况下,它无条件返回false,并且不强制执行多因素。
  2. 子类化djangosaml2idp.views.processmultifatorview视图,为您的环境进行适当的调用。在multifactor\u is\u valid方法中实现您的自定义验证逻辑:这可以调用帮助程序脚本、内部短信触发服务、只有idp可以访问的数据源或外部第二因素提供程序(例如,赛门铁克VIP)。默认情况下,此视图将记录它已被调用,然后重定向。
  3. 更新urls.py并为name='saml_multi_factor'添加一个覆盖-确保它在导入djangosaml2idp url文件之前出现,以便使用自定义视图而不是内置视图。

运行测试套件

requirements-dev.txt

中安装开发依赖项
pip install -r requirements-dev.txt

从项目根目录运行py.test

py.test

示例项目

目录example_project包含演示登录注销功能的赤骨演示设置。 它由使用djangosaml2实现的服务提供者和使用djangosaml2idp实现的标识提供者组成。 该文件夹中的自述文件包含有关如何运行它的更多信息。

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

推荐PyPI第三方库


热门话题
在Spring的JPA查询中,用java问号代替unicode(印地语)字符?   如何在React Native中调用Java字符串并实时显示   java如何在空手道dsl中用soap响应(xml)验证xml模式(XSD)   获取枚举值作为Java 8中的字符串列表   java My annotation@Value返回null,即使它被使用并调用到组件注释类中   获取Java中PostgreSQL数据库的大小   javascript如何使用角度过滤thymeleaf列表   JAVAutil。非接触元素异常   java如何暂停循环直到获得用户输入?   java使用Scanner类解析字符串   java Hibernate乐观锁定和外部程序   java在按下按钮后检查文本框中的文本是否与字符串匹配   gwt替代已弃用的java日期。设定时间   java如何使用对象类型作为方法/构造函数的参数?