跳转到主要内容

repoze.who是一个用于WSGI的标识和认证框架。

项目描述

repoze.who

https://travis-ci.org/repoze/repoze.who.png?branch=master Documentation Status https://img.shields.io/pypi/v/repoze.who.svg https://img.shields.io/pypi/pyversions/repoze.who.svg

repoze.who是一个用于任意WSGI应用程序的标识和认证框架。repoze.who既可以配置为WSGI中间件,也可以作为应用程序使用的API。

repoze.who受到Zope 2的可插拔认证服务(PAS)的启发(但repoze.who在任何方面都不依赖于Zope;它对任何WSGI应用程序都很有用)。它不提供授权功能(确保用户能否执行请求所暗示的操作)。这被认为是WSGI应用程序的领域。

安装

使用setuptools安装,例如(在虚拟环境中)

$ easy_install repoze.who

或使用pip

$ pip install repoze.who

用法

有关使用各种组件的详细信息,请参阅 docs/index.rst 中的文档。该文档的渲染版本也在线上提供。

报告错误

请将此包的错误报告给

https://github.com/repoze/repoze.who/issues

获取源代码

通过访问以下链接下载软件的开发版本或标记版本:

https://github.com/repoze/repoze.who

repoze.who 变更日志

3.0.0 (2023-01-16)

  • 从 3.0.0b1 版本以来没有变化。

3.0.0b1 (2023-01-16)

  • 添加对 Python 3.9、3.10 和 3.11 的支持。

  • 停止对 Python 2.7、3.4、3.5 和 3.6 的支持。

  • 添加 GitHub Actions 工作流程以执行单元测试/覆盖率。

2.4.1 (2022-02-01)

  • 不允许在 AuthTicket 组件值中使用分隔符。关闭 #37。

  • 在 'repoze.who.plugins.htpasswd.sha1_check' 中正确处理 bytes / string。关闭 #28。

  • 切换到使用 pytest 作为测试运行器。关闭 #34。

2.4 (2020-06-03)

  • 添加对 Python 3.6、3.7 和 3.8 的支持。

  • 停止对 Python 3.3 的支持。

  • 修复 travis 配置。

  • 向 AuthTktCookiePlugin 构造函数添加 samesite 选项。如果传递此选项,它应该是一个字符串,并将用于组成 Set-Cookie 标头的 "SameSite" 值,例如,如果您将 samesite="Strict" 传递给构造函数,则 auth tkt cookie 的值将包含 SameSite=Strict

2.3 (2016-05-31)

  • 添加对 Python 3.4、Python 3.5 和 PyPy3 的支持。

  • 停止对 Python 2.6 和 3.2 的支持。

  • middleware:在 egress 期间避免将提取的 identity 传递给 remember(应用程序可能已调用 api.forget())。参见 #21。

  • _auth_tkt / plugins.auth_tkt:添加对 Python 标准库中 hashlib 模块支持的任何哈希算法的支持。通过 #23 解决 #22。

  • plugins.auth_tkt:修复 "userdata" 的存储以保存字典。通过 #18 解决 #14。

  • middleware:当包装的生成器不提供项目时避免 UnboundLocalError。参见:http://bugs.repoze.org/issue184

  • 使 cookie 过期日期符合 RFC-2616(独立于区域设置,包括 'GMT' 时区)。参见 #11。

2.2 (2013-05-17)

  • 使用 SafeConfigParser 解析 INI 文件配置:允许转义 '%',例如,使用 pyformat 的查询模板在 DB-API 连接中保留模板。

  • 添加了对 Python 3.3、PyPy 的支持。

2.1 (2013-03-20)

  • _compat 模块:容忍 WSGI 环境中缺少 CONTENT_TYPE 键。感谢 Dag Hoidal 的补丁。

  • htpasswd 插件:添加 sha1_check 检查函数(Windows 上不可用 crypt 模块)。感谢 Chandrashekar Jayaraman 的补丁。

  • 从 Carlos de la Guardia 和 Atsushi Odagiri 修复了文档中的错误。

2.1b1 (2012-11-05)

  • 使用“兼容子集”模式移植到 Py3k。- 丢弃了对 Python < 2.6.x 的支持。- 丢弃了对 Paste 的依赖(从其中分叉了一些代码)。- 添加了对 WebOb 的依赖。感谢 Atsushi Odagiri (aodag) 为初始努力。

2.0 (2011-09-28)

2.0b1 (2011-05-24)

2.0a4 (2011-02-02)

  • 确保中间件按照PEP 333的要求,在从包装的应用程序返回的可迭代对象上调用close()(如果存在)。 http://bugs.repoze.org/issue174

  • 使 make_api_factory_with_config 能够容忍无效的文件名/内容配置文件:在这种情况下,API工厂将没有任何配置的插件或策略:它仅用于从由中间件填充的环境中检索API。

  • 修复了 repoze.who.api 中的错误,其中 remember()forget() 方法在标识插件返回 None 时可能会返回 None。

  • 修复 auth_tkt 插件,以防止将令牌作为字符串传递。请参阅 http://lists.repoze.org/pipermail/repoze-dev/2010-November/003680.html

  • 修复 auth_tkt 插件,当配置为 secure=True 时,将“secure”和“HttpOnly”添加到cookie中:这些属性防止浏览器在不安全的通道上发送cookie,这可能容易受到某些XSS攻击。

  • 避免将unicode 'max_age'值传播到cookie头中。请参阅 https://bugs.launchpad.net/bugs/674123

  • 添加了一个BFG应用程序的单一文件示例,演示了使用API对象的新 'login' 和 'logout' 方法。

  • loginlogout 方法添加到 repoze.who.api.API 对象中,以便于应用程序驱动的登录/注销代码,否则需要使用API的私有方法,并深入到其插件中。

2.0a3 (2010-09-30)

  • 弃用了以下插件,将它们的模块、测试和文档移动到新项目 repoze.who.deprecatedplugins

    • repoze.who.plugins.cookie.InsecureCookiePlugin

    • repoze.who.plugins.form.FormPlugin

    • repoze.who.plugins.form.RedirectingFormPlugin

  • 使 repoze.who.plugins.cookie.InsecureCookiePlugin 接受一个 charset 参数,并用于编码/解码登录和密码。请参阅 http://bugs.repoze.org/issue155

  • 更新 repoze.who.restrict 以返回列表形式的头,以避免 wsgiref 抱怨。

  • 帮助默认请求分类器处理显式定义字符集的xml提交: http://bugs.repoze.org/issue145 (Lorenzo M. Catucci)

  • 在默认分类器中匹配XML帖子到 xmlpost 时,更正了类型和子类型的处理,根据RFC 2045,必须不区分大小写地进行匹配: http://bugs.repoze.org/issue145 (Lorenzo M. Catucci)

  • 添加了 repoze.who.config:make_api_factory_with_config,这是一个便利方法,用于希望从配置文件设置自己的API工厂的应用程序。

  • 修复了对 repoze.who.config:make_middleware_with_config 的示例调用(添加了缺少的 global_config 参数)。请参阅 http://bugs.repoze.org/issue114

2.0a2 (2010-03-25)

已修复的错误

  • 修复了在 repoze.who.api:API.challenge 的日志消息字符串格式化中传递替换值失败的问题。修复包括为API对象执行的所有日志添加测试。请参阅 http://bugs.repoze.org/issue122

向后不兼容性

  • 将一些低级别细节的日志级别从 info 调整为 debug

2.0a1 (2010-02-24)

功能

  • 恢复了使用旧 classifier 参数创建中间件的功能。该参数现在是 request_classifier 的一个已被弃用但将永久有效的别名。

  • auth_tkt 插件现在实现了 IAuthenticator 接口,应通常作为 IIdentifierIAuthenticator 使用。

  • 将中间件对象的 API 因素化,以便在应用程序内部使用。使用 repoze.who 的应用程序现在分为三类

    • “仅中间件”的应用程序配置了中间件,并使用环境中的 REMOTE_USERrepoze.who.identity 来确定已验证用户。

    • “裸机”应用程序完全不使用 repoze.who 中间件:而是在启动时配置并创建一个 APIFactory 对象,并在需要时按请求创建 API 对象。

    • “混合”应用程序配置了 repoze.who 中间件,但使用新的库函数从环境变量中获取 API 对象,例如在注册或成功登录后调用 remember

已修复的错误

  • 修复了 http://bugs.repoze.org/issue102:当不存在挑战者时,记录会导致异常。

  • 删除了 ez_setup.py 和在 setup.py 中的依赖项(支持 distribute)。

向后不兼容性

  • 中间件以前允许标识插件“预先验证”一个身份。此功能不再受支持:以前使用该功能的 auth_tkt 插件现在配置为作为验证器插件(以及标识器)工作。

  • repoze.who.middleware:PluggableAuthenticationMiddleware 类不再具有以下(非 API)方法(现在作为 repoze.who.api:API 类的 API 方法实现)

    • add_metadata

    • authenticate

    • challenge

    • identify

  • 以下(非 API)函数已从 repoze.who.middleware 移动到 repoze.who.api

    • make_registries

    • match_classification

    • verify

1.0.18 (2009-11-05)

  • 问题 #104:AuthTkt 插件在 forget 中传递了无效的 cookie 值,并且没有设置那些 cookie 的 Max-AgeExpires 属性。

1.0.17 (2009-11-05)

  • 修复了 repoze.who.plugins.form.make_plugin 工厂对 formcallable 参数的处理,以允许传递点分名称(例如,从配置文件中)。

1.0.16 (2009-11-04)

  • formcallable 参数公开给 repoze.who.plugins.form.FormPlugin 的调用者 repoze.who.plugins.form.make_plugin 工厂。感谢 Roland Hedburg 的报告。

  • 修复了在使用 ini 配置解析器时导致以下症状的问题

    TypeError: _makePlugin() got multiple values for keyword argument 'name'

    有关更多详细信息,请参阅 http://bugs.repoze.org/issue92。感谢 vaab 提交的 bug 报告和初始修复。

1.0.15 (2009-06-25)

  • 如果在 identify 方法处理 login_handler_path 时存在表单 post 值 max_age,则将 max_age 值作为 max_age 传递到返回的身份字典中。请参阅下面的要点以了解原因。

  • 如果传递给 auth_tkt remember 方法的 identity 字典中包含一个带有字符串(或整数)值的 max_age 键,则将其视为设置返回cookie中的 Max-AgeExpires 头的提示。cookie的 Max-Age 设置为该值,而 Expires 是从当前时间计算的。

1.0.14 (2009-06-17)

  • 修复Windows上的测试中断问题。请参阅 http://bugs.repoze.org/issue79

  • auth_tkt 插件中使用 include_ip 设置的问题已记录。请参阅 http://bugs.repoze.org/issue81

  • 添加了 'passthrough_challenge_decider',它可以避免重新挑战应用程序已“预先挑战”的401响应。

  • 百分之一百的单元测试覆盖率。

  • 感谢Paul Johnston,将 timeoutreissue_time 参数添加到 auth_tkt 标识插件中。

  • 感谢Gustavo Narea,将 userid_checker 参数添加到 auth_tkt 标识插件中。

    如果提供了 userid_checker,则它必须是一个点分Python名称,它解析到一个函数,该函数接受一个用户ID并返回一个布尔值True或False,表示该用户是否存在于数据库中。这是一个折衷方案。由于repoze.who的设计错误,唯一检查用户存在的方法是使用一个或多个IAuthenticator插件的 authenticate 方法。如果IAuthenticator的 authenticate 方法返回true,则表示用户存在。然而,大多数IAuthenticator插件期望 同时 提供用户名和密码,并且在未提供两者时无条件返回False。这意味着认证器无法用于检查用户“仅”是否存在。由auth_tkt提供的身份信息不包含用于检查的密码。repoze.who的实际设计错误是:当用户出示来自auth_tkt的凭据时,他被认为是“预先认证”的。IAuthenticator.authenticate永远不会为“预先认证”的身份调用,这很好用,但它意味着用户将被视为已认证,即使您已从您正在使用的数据库中删除了该用户的记录。但是,如果您使用userid_checker,则可以确保auth_tkt提供的用户ID存在。如果userid_checker返回False,则auth_tkt凭据被认为是“无效”的。

1.0.13 (2009-04-24)

  • IAuthenticator 文档字符串中添加了一个段落,记录了插件允许向 identity 字典添加键(例如,在 IMetadataProvider 插件中节省第二次数据库查询)。

  • 为问题 #71 提供了补丁(http://bugs.repoze.org/issue71),其中下游应用程序可以返回一个生成器,依赖于上游组件调用start_response。我们这样做是因为挑战决定者需要状态和头信息来决定要做什么。

1.0.12 (2009-04-19)

  • auth_tkt插件试图将REMOTE_USER_TOKENS数据追加到auth_tkt.parse_tkt返回的现有tokens数据中;这是不正确的;只需覆盖。

  • 扩展auth_tkt插件工厂,允许从主配置文件中单独传递密钥。请参阅 http://bugs.repoze.org/issue40

1.0.11 (2009-04-10)

  • 修复auth_tkt插件;现在cookie值被引用,这使得在用户名中放置空格和其他空白字符等成为可能。(感谢Michael Pedersen)。

  • 修复了在没有任何标识符或认证器时尝试记录时引发的异常的边缘案例问题。

1.0.10 (2009-01-23)

  • RedirectingFormPlugin现在会将应用在NotFound响应中设置的SetCookie头传递下去(解决了TG2 "flash"问题)。

1.0.9 (2008-12-18)

  • RedirectingFormPlugin现在尝试在应用设置挑战时的响应头中找到名为X-Authentication-Failure-Reason的头。如果存在这个头的值(并且不是空的),这个值会作为reason参数(或用户可设置的键)附加到重定向URL的查询字符串中。这使得下游应用能够发出一个带有此头的挑战响应,并在挑战导致的登录表单中显示该原因。

1.0.8 (2008-12-13)

  • PluggableAuthenticationMiddleware构造函数接受一个log_stream参数,通常是一个文件。在此版本发布后,它也可以是一个PEP 333 Logger实例;如果是PEP 333 Logger实例,则此日志记录器将被用作repoze.who日志记录器(而不是像以前那样由中间件构建)。当log_stream参数是PEP 333 Logger对象时,忽略log_level参数。

1.0.7 (2008-08-28)

  • repoze.who和repoze.who.plugins没有在setup.py的namespace_packages列表中添加,这可能导致1.0.6版本成为一个brownbag版本,因为将其作为命名空间包的唯一原因是它的发布。

1.0.6 (2008-08-28)

  • 将repoze.who和repoze.who.plugins转换为命名空间包,主要是为了允许插件作者在repoze.who.plugins命名空间中分发包。

1.0.5 (2008-08-23)

  • 修复了auth_tkt插件,使其在remember方法和forget方法中设置相同的cookies。之前,使用auth_tkt标识符插件登出并重新登录到网站时,可能会有些危险,并且有时可能不会正常工作。

  • FormPlugin插件增加了一个在未授权时重定向的功能。任何导致挑战并包含Location头的下游应用的响应都将导致重定向到Location头的值。

1.0.4 (2008-08-22)

  • 在‘[general]’配置部分中添加了一个键:remote_user_key。如果您在配置文件中使用此键,它告诉谁在入口时如果环境中有此键则不执行任何认证,并将键设置在环境变量中供下游应用作为REMOTE_USER变量使用。默认值为REMOTE_USER

  • 使用与auth_tkt插件结合的unicode用户ID会在mod_wsgi下引起问题。

  • 允许InsecureCookiePlugin(和配置构造函数)使用‘cookie_path’参数。感谢Gustavo Narea。

1.0.3 (2008-08-16)

  • 中间件中authenticate方法的一个错误使得无法使用null(例如0、False)作为用户ID进行认证,这些是有效的标识符。现在唯一无效的用户ID是None。

  • 应用了Olaf Conradi提供的补丁,当传递无效的文件名给HTPasswdPlugin时记录一个错误。

1.0.2 (2008-06-16)

  • 修复了Chris Perkins发现的bug:auth_tkt插件的“remember”方法没有正确处理Python“long”实例的用户ID。症状:在“paste.auth.auth_tkt”中TypeError:不能连接“str”和“long”对象。

  • 添加了基于谓词的“restriction”中间件支持(repoze.who.restrict),允许配置驱动的授权作为WSGI过滤器。提供了一个示例谓词,‘authenticated_predicate’,它要求用户通过‘REMOTE_USER’或通过‘repoze.who.identity’进行认证。要使用过滤器来限制访问

      [filter:authenticated_only]
      use = egg:repoze.who#authenticated
    
    or::
    
      [filter:some_predicate]
      use = egg:repoze.who#predicate
      predicate = my.module:some_predicate
      some_option = a value

1.0.1 (2008-05-24)

  • 移除了对dist.repoze.org的依赖链接,以防止easy_install将其搜索路径插入其中(依赖项可以从PyPI获得)。

1.0 (2008-05-04)

  • 在plugins.form.FormPlugin插件收集身份信息后没有正确重定向。症状:下游应用会收到一个空的POST请求体,这有时会导致Bad Request错误。

  • 修复了‘classifiers.default_request_classifier’和‘classifiers.default_password_compare’的接口声明。

  • 添加了实际的配置驱动中间件工厂,'config.make_middleware_with_config'。

  • 从插件工厂函数中移除了固化的 'who_conf' 参数。

  • 添加了基于 ConfigParser 的 WhoConfig,实现了在 http://www.plope.com/static/misc/sphinxtest/intro.html#middleware-configuration-via-config-file 中概述的规范,以下是一些更改

    • 可以指定“裸”插件(不需要配置选项)

      可以是 egg 入口点(例如,'egg:distname#entry_point_name')或点分路径加冒号(例如,'dotted.name:object_id')。

    • 因此,插件和其分类器之间的分隔符现在是分号,而不是冒号。例如

      [plugins:id_plugin]
      use = egg:another.package#identify_with_frobnatz
      frobnatz = baz
      
      [identifiers]
      plugins =
        egg:my.egg#identify;browser
        dotted.name:identifier
        id_plugin

0.9.1 (2008-04-27)

  • 修复了 auth_tkt 插件以能够编码和解码整数用户 ID。

0.9 (2008-04-01)

  • 修复了 0.8 版本中引入的 FormPlugin 的错误(未设置 rememberer 头)。

  • 将 PATH_INFO 添加到启动和结束日志信息中。

  • 在 plugins/sql 中添加了 SQLMetadataProviderPlugin。

  • 更改 SQLAuthenticatorPlugin 构造函数:现在它只接受“query”、“conn_factory”和“compare_fn”。旧构造函数接受一个 DSN,但某些数据库系统不使用 DBAPI DSN。新构造函数不接受 DSN;假设 conn_factory 执行所有创建连接的工作,包括知道是否需要 DSN。'conn_factory' 应返回当不带参数调用时返回数据库连接的对象。此辅助程序中 conn_factory 所引用的顶级可调用对象应返回一个函数,当不带参数调用时返回一个数据库连接。顶级可调用对象本身将使用“who_conf”(全局 who 配置)和任何非顶级关键字参数(如传递给辅助程序一样)进行调用,以允许传递 DSN 或 URL 或其他内容。

  • plugins/sql 中的 "make_plugin" 辅助程序已重命名为 "make_authenticator_plugin"。当调用时,此辅助程序将返回一个 SQLAuthenticatorPlugin。在 "make_authenticator_plugin" 中的一些辅助逻辑允许计算连接工厂。在此辅助程序中 conn_factory 所引用的顶级可调用对象应返回一个函数,当不带参数调用时返回一个数据库连接。顶级可调用对象本身将使用“who_conf”(全局 who 配置)和任何非顶级关键字参数(如传递给辅助程序一样)进行调用,以允许传递 DSN 或 URL 或其他内容。

  • plugins/sql 中已添加 "make_metatata_plugin" 辅助程序。当调用时,这将创建一个 SQLMetadataProviderPlugin。有关详细信息,请参阅实现。它类似于 "make_authenticator_plugin" 辅助程序。

0.8 (2008-03-27)

  • 添加了一个 RedirectingFormIdentifier 插件。此插件愿意重定向到外部(或下游应用程序)登录表单以执行身份验证。外部登录表单必须将数据发送到插件(例如,'login_handler_path')(理想情况下带有“came_from”值,以告诉插件在身份验证成功后应将响应重定向到哪里)。可以访问此插件的“logout_handler_path”以执行注销。“came_from”值也适用于那里。

  • 现在允许标识插件在进入时在环境中设置一个名为 'repoze.who.application' 的键(在 'identify' 中)。如果标识插件这样做,则将使用此应用程序而不是“正常”的下游应用程序。此功能被添加以更简单地支持重定向表单标识插件。

0.7 (2008-03-26)

  • 更改 IMetadataProvider 接口:该接口以前有一个返回字典的“metadata”方法。此方法不再是该 API 的一部分。它已被替换为具有以下签名的“add_metadata”方法

     def add_metadata(environ, identity):
         """
         Add metadata to the identity (which is a dictionary)
         """
    
    The return value is ignored.  IMetadataProvider plugins are now
    assumed to be responsible for 'scribbling' directly on the identity
    that is passed in (it's a dictionary).  The user id can always be
    retrieved from the identity via identity['repoze.who.userid'] for
    metadata plugins that rely on that value.

0.6 (2008-03-20)

  • 重命名:repoze.pam 现在是 repoze.who

  • 提升 ez_setup.py 版本。

  • 添加 IMetadataProvider 插件类型。Chris 说“Whit 规则”。

0.5 (2008-03-09)

  • 允许“远程用户键”(默认:REMOTE_USER)可以被覆盖(将 remote_user_key 传递给中间件构造函数)。

  • 允许表单插件覆盖默认表单。

  • API 变更:IIdentifiers 不再需要在返回的身份字典中同时放置“login”和“password”。相反,IIdentifier 可以在身份字典中放置任意键值对(或返回一个空字典)。

  • API 返回值变更:IIdentifiers 返回的“failure”身份现在是 None 而不是空字典。

  • 现在,IAuthenticator接口规定,当评估一个没有“预期”键/值对(例如,当期望登录和密码的IAuthenticator检查由基于IP的认证系统返回的身份时,该系统只将IP地址放入身份)时,IAuthenticators不得抛出异常;相反,它们通过返回None优雅地失败。

  • 添加(cookie)"auth_tkt"身份验证插件。

  • 通过在每个经过身份验证的身份中将名为'repoze.pam.userid'的键放入身份字典来在身份字典上盖章用户ID。

  • 如果IIdentifier插件将'repoze.pam.userid'键插入身份字典,则认为此身份“预先认证”。不会要求身份验证插件对这一身份进行身份验证。这旨在用于像最近添加的auth_tkt插件这样的东西,它将用户ID嵌入到票据中。这实际上允许IIdentifier插件在将责任分解为两个单独的插件是“工作量”时成为IAuthenticator插件。在决定为任何给定的请求使用哪个身份时,首先选择预先认证的身份。

  • 如果在入口点找到身份,则在WSGI环境中插入一个名为'repoze.pam.identity'的键。它的值将是与repoze.pam在入口点选择的身份相关的身份字典。允许下游消费者修改此字典;此值传递给“记住”和“忘记”,因此其主要用途是执行“凭证重置”;例如,用户在应用程序中更改了用户名或密码,但我们在他这样做后不希望他再次登录。

0.4 (03-07-2008)

  • 允许插件为每个接口指定一个分类器列表(而不是每个插件一个单独的分类器列表)。

0.3 (03-05-2008)

  • 使SQLAuthenticatorPlugin的默认_password_compare使用hexdigest sha而不是base64的二进制sha以进行更简单的转换。

0.2 (03-04-2008)

  • 添加了SQLAuthenticatorPlugin(见plugins/sql.py)。

0.1 (02-27-2008)

  • 初始发布(尚不支持配置文件)。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关安装软件包的更多信息。

源分发

repoze.who-3.0.0.tar.gz (315.6 KB 查看散列

上传时间

构建分发

repoze.who-3.0.0-py3-none-any.whl (66.0 KB 查看散列

上传于 Python 3

由支持