Zope3安全组件的ZMI视图
项目描述
本软件包为Zope安全组件提供ZMI浏览器视图。
它曾为Zope 3提供大部分安全功能,但为了减少依赖和提高复用性,这些功能已被分解到几个小包中。
功能被分解到以下新包中
zope.authentication - IAuthentication接口和相关实用工具。
zope.principalregistry - 全局主体注册及其zcml指令。
zope.app.localpermission - 实现持久权限的LocalPermission类。
本包提供的其余功能已合并到zope.security和zope.publisher。
提供向后兼容的导入以确保旧应用程序正常工作。有关更多信息,请参阅CHANGES.txt。
详细文档
认证实用工具的查询视图
常规认证服务不会提供ISourceQueriables接口,但它本身是可查询的,因为它提供了简单的getPrincipals(name)方法。
>>> class Principal: ... def __init__(self, id): ... self.id = id>>> class MyAuthUtility: ... data = {'jim': Principal(42), 'don': Principal(0), ... 'stephan': Principal(1)} ... ... def getPrincipals(self, name): ... return [principal ... for id, principal in self.data.items() ... if name in id]
现在我们有了可查询的对象,我们为其创建视图。
>>> from zope.app.security.browser.auth import AuthUtilitySearchView >>> from zope.publisher.browser import TestRequest >>> request = TestRequest() >>> view = AuthUtilitySearchView(MyAuthUtility(), request)
这允许我们渲染一个搜索表单。
>>> print(view.render('test')) # doctest: +NORMALIZE_WHITESPACE <h4>principals.zcml</h4> <div class="row"> <div class="label"> Search String </div> <div class="field"> <input type="text" name="test.searchstring" /> </div> </div> <div class="row"> <div class="field"> <input type="submit" name="test.search" value="Search" /> </div> </div>
如果我们请求结果
>>> view.results('test')
我们不会得到任何结果,因为我们没有提供任何。但如果我们输入
>>> request.form['test.searchstring'] = 'n'
我们仍然得不到任何结果
>>> view.results('test')
因为我们没有按下按钮。所以让我们按下按钮
>>> request.form['test.search'] = 'Search'
这样我们现在就能得到结果了(!)
>>> ids = list(view.results('test')) >>> ids.sort() >>> ids [0, 1]
登录/注销片段
类 LoginLogout
>>> from zope.app.security.browser.auth import LoginLogout
用作视图以生成适合登录或注销的HTML片段,这取决于当前主体是否已通过认证。
当当前主体未认证时,它提供 IUnauthenticatedPrincipal
>>> from zope.authentication.interfaces import IUnauthenticatedPrincipal >>> from zope.principalregistry.principalregistry import UnauthenticatedPrincipal >>> anonymous = UnauthenticatedPrincipal('anon', '', '') >>> IUnauthenticatedPrincipal.providedBy(anonymous) True
当 LoginLogout 用于具有未认证主体的请求时,它为用户提供一个“登录”链接
>>> from zope.publisher.browser import TestRequest >>> request = TestRequest() >>> request.setPrincipal(anonymous) >>> print(LoginLogout(None, request)()) <a href="@@login.html?nextURL=http%3A//127.0.0.1">[Login]</a>
在此处尝试登录将失败,因为没有对主体进行授权
>>> from zope.app.security.browser.auth import HTTPAuthenticationLogin >>> login = HTTPAuthenticationLogin() >>> login.request = request >>> login.context = None >>> login.failed = lambda: 'Login Failed' >>> login.login() 'Login Failed'
有一个安全措施将尝试请求HTTP基本认证
>>> from zope.app.security.browser.auth import HTTPBasicAuthenticationLogin >>> basic_login = HTTPBasicAuthenticationLogin() >>> basic_login.request = request >>> basic_login.failed = lambda: 'Basic Login Failed' >>> basic_login.login() 'Basic Login Failed' >>> request._response.getHeader('WWW-Authenticate', literal=True) 'basic realm="Zope"' >>> request._response.getStatus() 401
当然,未经授权的主体将被确认注销
>>> from zope.app.security.browser.auth import HTTPAuthenticationLogout >>> logout = HTTPAuthenticationLogout(None, request) >>> logout.logout(nextURL="bye.html") 'bye.html' >>> logout.confirmation = lambda: 'Good Bye' >>> logout.logout() 'Good Bye'
然而,注销的行为不同。并非所有认证协议(即凭证提取器/挑战者)都支持“注销”。此外,我们不知道管理员如何配置Zope的认证。我们的解决方案是依赖管理员明确告诉我们该网站支持注销。
默认情况下,LoginLogout片段不会为未经认证的主体提供注销链接。为了说明,我们将首先设置一个具有未经认证主体的请求
>>> from zope.security.interfaces import IPrincipal >>> from zope.interface import implementer >>> @implementer(IPrincipal) ... class Bob: ... id = 'bob' ... title = description = '' >>> bob = Bob() >>> IUnauthenticatedPrincipal.providedBy(bob) False >>> request.setPrincipal(bob)
在这种情况下,默认行为是为片段返回 None
>>> print(LoginLogout(None, request)()) None
此时,登录将正确地将我们导向下一个URL,或确认页面
>>> login = HTTPAuthenticationLogin() >>> login.request = request >>> login.context = None >>> login.login(nextURL='good.html') >>> login.confirmation = lambda: "You Passed" >>> login.login() 'You Passed'
同样适用于HTTP基本认证
>>> login = HTTPBasicAuthenticationLogin() >>> login.request = request >>> login.context = None >>> login.confirmation = lambda: "You Passed" >>> login.login() 'You Passed'
要显示注销提示,管理员必须注册一个提供该接口的标记适配器
>>> from zope.authentication.interfaces import ILogoutSupported
这向LoginLogout标记该网站支持注销。可以注册一个“无操作”适配器来完成此操作
>>> from zope.authentication.logout import LogoutSupported >>> from zope.component import provideAdapter >>> provideAdapter(LogoutSupported, (None,), ILogoutSupported)
现在当使用LoginLogout与未经认证的主体时,我们会得到一个注销提示
>>> print(LoginLogout(None, request)()) <a href="@@logout.html?nextURL=http%3A//127.0.0.1">[Logout]</a>
我们可以注销此主体,传递一个要重定向到的URL
>>> logout = HTTPAuthenticationLogout(None, request) >>> logout.redirect = lambda: 'You have been redirected.' >>> logout.logout(nextURL="loggedout.html") 'You have been redirected.'
更改
6.0 (2023-02-17)
添加对Python 3.10,3.11的支持。
取消对Python 2.7,3.5,3.6的支持。
5.1.0 (2020-10-28)
添加对Python 3.8和3.9的支持。
取消对Python 3.5的支持。
从globalmodules.zcml中取消对已弃用的binhex标准库模块的安全声明。
请注意,应避免使用globalmodules.zcml。最好是只为实际需要使用的部分做出声明。
5.0.0 (2019-07-12)
添加对Python 3.7的支持。
取消对Python 3.4的支持。
从globalmodules.zcml中取消对已弃用的formatter标准库模块的安全声明。
请注意,应避免使用globalmodules.zcml。最好是只为实际需要使用的部分做出声明。
4.0.0 (2017-04-27)
优先使用stdlib的doctest,移除对“zope.testing.doctestunit”的使用。
优先使用“zope.app.wsgi”,移除对“zope.app.testing”的使用。
添加对PyPy、Python 3.4、3.5和3.6的支持。
3.7.5 (2010-01-08)
将“zope.ManageApplication”权限移动到“zope.app.applicationcontrol”。
修复使用较新zope.publisher的测试,该publisher需要zope.login。
3.7.3 (2009-11-29)
提供干净的zope设置并将zope.app.testing移动到测试依赖项
从install_requires中移除未使用的依赖项,如ZODB3等。
3.7.2 (2009-09-10)
为PersistentList和PersistentDict添加了数据属性到“_protections.zcml”,以适应在代理时UserList和UserDict的行为。
3.7.1 (2009-08-15)
将globalmodules.zcml更改为避免对已弃用的标准模块做出声明,以避免弃用警告。
请注意,应避免使用globalmodules.zcml。最好是只为实际需要使用的部分做出声明。
3.7.0 (2009-03-14)
所有接口以及一些与认证相关的辅助类和函数(checkPrincipal、PrincipalSource、PrincipalTerms等)都已移动到新的zope.authentication包。提供了向后兼容的导入。
“全局主体注册”及其zcml指令已移动到新的“zope.principalregistry”包。提供了向后兼容的导入。
IPrincipal -> zope.publisher.interfaces.logginginfo.ILoggingInfo 适配器已移至 zope.publisher。提供了向后兼容的导入。
PermissionsVocabulary 和 PermissionIdsVocabulary 已移至 zope.security 包中。提供了向后兼容的导入。
“zope.Public” 权限以及一些其他常见权限(如“zope.View”)的注册已移至 zope.security。现在该包的 configure.zcml 包含了这些配置。
“protect” 函数现在是一个空操作,不再需要,因为 zope.security 现在知道 i18n 消息和 __name__ 以及 __parent__ 属性,并且默认不会保护它们。
addCheckerPublic 已从 zope.app.security.tests 移至 zope.security.testing。提供了向后兼容的导入。
LocalPermission 类已移至新的 zope.app.localpermission 包。此包现在仅包含向后兼容的导入和 zcml 包含。
在重构后清理依赖项。同时,不再依赖 zope.app.testing 进行测试。
更新包描述,以指出已进行的重构。
3.6.2 (2009-03-10)
长期以来,始终建议从 zope.securitypolicy.interfaces 导入 Allow、Deny 和 Unset 权限设置,现在它们已完全从 zope.app.security.settings 以及 PermissionSetting 类移至那里。为了向后兼容,如果安装了 zope.securitypolicy,则仅保留导入 Allow/Unset/Deny 常量的向后兼容性,以允许反序列化安全设置。
3.6.1 (2009-03-09)
依赖新的 zope.password 包而不是 zope.app.authentication 来获取身份验证实用程序的密码管理器,从而删除对 zope.app.authentication 的依赖。
使用模板代替在 Python 代码中构建难看的 HTML,用于 AuthUtilitySearchView。
错误:在 Python 2.6 中已弃用 sha 和 md5 模块。当在 Python 2.6 中使用时,包括此包的 ZCML 时,会引发弃用警告,指出 md5 和 sha 已弃用。提供了一种简单的条件来检查是否安装了 Python 2.6 或更高版本,方法是检查是否添加了 json 模块,该模块仅在 Python 2.6 中添加,因此可选地加载 md5 和 sha 的安全声明。
删除已弃用的代码,从而删除对 zope.deprecation 和 zope.deferredimport 的显式依赖。
稍微清理代码,用 adapts 调用替换旧的 __used_for__ 语句。
3.6.0 (2009-01-31)
由于 zope3-dev 已退役,将邮件列表地址更改为 zope-dev at zope.org。将包主页上的“cheeseshop”更改为“pypi”。
将 protectclass 模块移至 zope.security,此处仅保留一个兼容性模块,它从新位置导入。
将
zope.security。 使用 zope.container 而不是 zope.app.container。
3.5.3 (2008-12-11)
使用 zope.browser.interfaces.ITerms 而不是 zope.app.form.browser.interfaces。
3.5.2 (2008-07-31)
错误:检查正则表达式不是一个很好的主意,因为它会在 Python 2.4 中引发弃用警告。因此,让我们寻找在 Python 2.5 中添加的库。
3.5.1 (2008-06-24)
错误:在 Python 2.5 中已弃用 gopherlib 模块。当在 Python 2.5 中使用时,包括此包的 ZCML 时,会引发弃用警告,指出 gopherlib 已弃用。提供了一种简单的条件来检查是否安装了 Python 2.5 或更高版本,方法是检查已删除的 regex 模块,因此可选地加载 gopherlib 的安全声明。
3.5.0 (2008-02-05)
功能:当其 id 被用作搜索键时,zope.app.security.principalregistry.PrincipalRegistry.getPrincipal 返回 zope.security.management.system_user。
3.4.0 (2007-10-27)
首次发布,与主 Zope 树独立。
项目详细信息
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。