Zope3认证视图插件
项目描述
此软件包为Zope3提供了认证视图实现。
登录和登出
登录和登出均适用于基本认证和Cookie认证。
设置
布局页面模板必须包含两个内容提供者(视图管理器)
login-logout-head 在head标签内以获得自动重定向和执行基本认证登出的JavaScript代码,以及
login-logout 在body标签内以获得登录和登出链接。
示例模板如下
>>> import os.path
>>> template_path = os.path.join(os.path.dirname(__file__), "tests",
... "login-logout-template.pt")
>>> with open(template_path, "r") as t:
... print(t.read())
<!DOCTYPE ...>
<html ...>
<head>
<title>PageletTest</title>
<tal:block replace="structure provider:login-logout-head" />
</head>
<body>
<tal:block replace="structure provider:login-logout" />
<tal:block replace="structure provider:pagelet" />
</body>
</html>
此模板在 ftesting.zcml 中注册为 IContainer 接口。创建容器后,在浏览容器时使用该模板。
>>> from zope.container.btree import BTreeContainer >>> layer.getRootFolder()['container'] = BTreeContainer()
基本认证
用户未登录时,显示登录链接。
>>> from zope.testbrowser.wsgi import Browser
>>> skinURL = 'https:///++skin++PageletTestSkin/'
>>> wsgi_app = layer.make_wsgi_app()
>>> browser = Browser(wsgi_app=wsgi_app)
>>> browser.handleErrors = False
>>> browser.open(skinURL + 'container/@@default.html')
>>> browser.url
'https:///++skin++PageletTestSkin/container/@@default.html'
>>> print(browser.contents)
<!DOCTYPE ...>
<html ...>
<head>
<title>PageletTest</title>
</head>
<body>
<a href="https:///++skin++PageletTestSkin/container/@@login.html?nextURL=http%3A///%2B%2Bskin%2B%2BPageletTestSkin/container/%40%40default.html">Login</a>
</body>
</html>
选择链接将导致登录页面,由于我们在此使用基本认证,我们得到HTTP错误401(未授权)。
>>> login_url = browser.getLink('Login').url
>>> browser.raiseHttpErrors = False
>>> browser.getLink('Login').click()
>>> print(browser.headers['status'])
401 Unauthorized
>>> print(browser.url)
https:///++skin++PageletTestSkin/container/@@login.html?nextURL=http%3A///%2B%2Bskin%2B%2BPageletTestSkin/container/%40%40default.html
输入正确的凭据后,我们获得授权。
>>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')
>>> browser.open(browser.url)
我们被重定向到我们选择登录链接的页面。登录后,登录链接不再显示。由于我们没有指定支持登出,因此没有显示登出链接。
>>> print(browser.url)
https:///++skin++PageletTestSkin/container/@@default.html
>>> print(browser.contents)
<!DOCTYPE ...>
<html ...>
<head>
<title>PageletTest</title>
</head>
<body>
</body>
</html>
再次调用登录URL将直接转到nextURL引用的页面。
>>> browser.open(login_url)
>>> print(browser.url)
https:///++skin++PageletTestSkin/container/@@default.html
>>> print(browser.contents)
<!DOCTYPE ...>
<html ...>
<head>
<title>PageletTest</title>
</head>
<body>
</body>
</html>
再次调用登录URL而不带查询参数将导致一个确认页面,告知登录成功。
>>> browser.open(login_url.split('?')[0])
>>> print(browser.url)
https:///++skin++PageletTestSkin/container/@@login.html
>>> print(browser.contents)
<!DOCTYPE ...>
<html ...>
<head>
<title>PageletTestLayout</title>
</head>
<body>
<div>
<h1>Login successful!</h1>
<p style="font-size: 200%"> You are now logged in as <em>Manager</em>. </p>
<a href=".">Back to the main page.</a>
</div>
</body>
</html>
选择 Back to the main page. 链接将用户送回到容器的默认视图。(ftesting.zcml 将 @@default.html 定义为默认视图。)
>>> browser.getLink('Back to the main page.').click()
>>> print(browser.url)
https:///++skin++PageletTestSkin/container/
>>> print(browser.contents)
<!DOCTYPE ...>
<html ...>
<head>
<title>PageletTest</title>
</head>
<body>
</body>
</html>
提供 ILogoutSupported 适配器会导致显示登出链接。
>>> import zope.component
>>> import zope.interface
>>> import zope.authentication.logout
>>> import zope.authentication.interfaces
>>> zope.component.provideAdapter(
... zope.authentication.logout.LogoutSupported,
... adapts=[zope.interface.Interface],
... provides=zope.authentication.interfaces.ILogoutSupported)
>>> browser.reload()
>>> print(browser.url)
https:///++skin++PageletTestSkin/container/
>>> print(browser.contents)
<!DOCTYPE ...>
<html ...>
<head>
<title>PageletTest</title>
</head>
<body>
<a href="https:///++skin++PageletTestSkin/container/@@logout.html?nextURL=http%3A///%2B%2Bskin%2B%2BPageletTestSkin/container/%40%40default.html">Logout</a>
</body>
</html>
使用JavaScript和重定向执行登出。zope.testbrowser >= 5.0不会遵循使用meta标签的重定向。
由于testbrowser无法执行JavaScript,用户保持认证状态。
>>> logout_url = browser.getLink('Logout').url
>>> browser.getLink('Logout').click()
>>> print(browser.url)
https:///++skin++PageletTestSkin/container/@@logout.html?nextURL=http%3A///%2B%2Bskin%2B%2BPageletTestSkin/container/%40%40default.html
>>> print(browser.contents)
<!DOCTYPE ...>
<html ...>
<head>
<title>PageletTest</title>
<script type="text/javascript"><!--
// clear HTTP Authentication
...
//-->
</script>
<meta http-equiv="refresh"
content="0;url=https:///++skin++PageletTestSkin/container/@@default.html" />
</head>
<body>
<a href="https:///++skin++PageletTestSkin/container/@@logout.html/@@logout.html?nextURL=http%3A///%2B%2Bskin%2B%2BPageletTestSkin/container/%40%40logout.html">Logout</a>
<div>
<h1>You are being redirected!</h1>
<p style="font-size: 150%">
<a href="https:///++skin++PageletTestSkin/container/@@default.html">
If you see this screen for more than 5 seconds, click here.
</a>
</p>
</div>
</body>
</html>
在登出后再次调用登出URL(使用新的浏览器实例模拟)将直接转到nextURL引用的页面。
>>> browser2 = Browser(logout_url, wsgi_app=wsgi_app)
>>> print(browser2.url)
https:///++skin++PageletTestSkin/container/@@default.html
>>> print(browser2.contents)
<!DOCTYPE ...>
<html ...>
<head>
<title>PageletTest</title>
</head>
<body>
<a href="https:///++skin++PageletTestSkin/container/@@login.html?nextURL=http%3A///%2B%2Bskin%2B%2BPageletTestSkin/container/%40%40default.html">Login</a>
</body>
</html>
再次调用登出URL而不带查询参数将导致一个确认页面,告知登出成功。
>>> browser2.open(logout_url.split('?')[0])
>>> print(browser2.url)
https:///++skin++PageletTestSkin/container/@@logout.html
>>> print(browser2.contents)
<!DOCTYPE ...>
<html ...>
<head>
<title>PageletTest</title>
<script type="text/javascript"><!--
// clear HTTP Authentication
...
//-->
</script>
</head>
<body>
<a href="https:///++skin++PageletTestSkin/container/logout.html/@@login.html?nextURL=http%3A///%2B%2Bskin%2B%2BPageletTestSkin/container/%40%40logout.html">Login</a>
<div>
<h1>Logout successful!</h1>
<p style="font-size: 200%">
You are now logged out.
</p>
<a href=".">Back to the main page.</a>
</div>
</body>
</html>
更改
2.0 (2023-02-09)
添加对Python 3.8、3.9、3.10、3.11的支持。
取消对Python 2.7、3.4、3.5、3.6的支持。
1.1 (2018-10-18)
添加对Python 3.7的支持。
1.0.1 (2017-06-08)
修复 setup.py 中声明的依赖项。
1.0 (2017-06-07)
更新到Python 3。现在支持:Python 3.4到3.6,PyPy2和PyPy3。
更新测试,使其与 zope.testbrowser >= 5.0 兼容。
0.8.0 (2010-10-13)
根据 z3c.layer.pagelet 1.9 的变更调整了测试设置,因此现在至少需要这个版本。
将代码从会话凭证登录页面的页面模板移动到视图类,以便可以自定义。(来自 zope.app.authentication.browser.loginform.LoginForm。)将视图类 SessionCredentialsLoginForm 从 z3c.authviewlet.auth 移动到 z3c.authviewlet.session。
0.7.0 (2009-12-27)
由于我们在这个包中只有浏览器代码,将 z3c.authviewlet.browser 中的文件移动到 z3c.authviewlet。
通过定义我们自己的 ILogin 接口,打破了与 zope.app.publisher 的依赖关系。
0.6.0 (2009-12-24)
添加了 i18n domains 以允许翻译(在 z3c.locales 包中完成)。
0.5.0 (2009-11-30)
将认证视图组件的实现从 z3c.layer.pagelet 移动到本包。
初始发布。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源分布
构建分布
z3c.authviewlet-2.0.tar.gz 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | e502d2e45956339400e4402325bad8d768e146680ea2f5e4449709cf8d589dd4 |
|
| MD5 | 14ef6fdbf25c79be59d16232090f03a9 |
|
| BLAKE2b-256 | 1d1db08d45b6fba8b645931d364d964d9adf7968f68ed0d473748bc3b7bca6b6 |
z3c.authviewlet-2.0-py3-none-any.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | f833cd503bbc8aa0bc39a0a1cb830964c039cf9c3ad67659ce64843e91b6866a |
|
| MD5 | af73512f97d033607fe225765f29fbe3 |
|
| BLAKE2b-256 | 533a1afaed5467746d685fc91e8aa0a94c1f6676d8cd50cebe0fa3c08d0b32df |