跳转到主要内容

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://127.0.0.1/++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://127.0.0.1/++skin++PageletTestSkin/container/@@default.html'
>>> print(browser.contents)
<!DOCTYPE ...>
<html ...>
  <head>
    <title>PageletTest</title>
  </head>
  <body>
    <a href="https://127.0.0.1/++skin++PageletTestSkin/container/@@login.html?nextURL=http%3A//127.0.0.1/%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://127.0.0.1/++skin++PageletTestSkin/container/@@login.html?nextURL=http%3A//127.0.0.1/%2B%2Bskin%2B%2BPageletTestSkin/container/%40%40default.html

输入正确的凭据后,我们获得授权。

>>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')
>>> browser.open(browser.url)

我们被重定向到我们选择登录链接的页面。登录后,登录链接不再显示。由于我们没有指定支持登出,因此没有显示登出链接。

>>> print(browser.url)
https://127.0.0.1/++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://127.0.0.1/++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://127.0.0.1/++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://127.0.0.1/++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://127.0.0.1/++skin++PageletTestSkin/container/
>>> print(browser.contents)
<!DOCTYPE ...>
<html ...>
  <head>
    <title>PageletTest</title>
  </head>
  <body>
    <a href="https://127.0.0.1/++skin++PageletTestSkin/container/@@logout.html?nextURL=http%3A//127.0.0.1/%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://127.0.0.1/++skin++PageletTestSkin/container/@@logout.html?nextURL=http%3A//127.0.0.1/%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://127.0.0.1/++skin++PageletTestSkin/container/@@default.html" />
  </head>
  <body>
    <a href="https://127.0.0.1/++skin++PageletTestSkin/container/@@logout.html/@@logout.html?nextURL=http%3A//127.0.0.1/%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://127.0.0.1/++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://127.0.0.1/++skin++PageletTestSkin/container/@@default.html
>>> print(browser2.contents)
<!DOCTYPE ...>
<html ...>
  <head>
    <title>PageletTest</title>
  </head>
  <body>
    <a href="https://127.0.0.1/++skin++PageletTestSkin/container/@@login.html?nextURL=http%3A//127.0.0.1/%2B%2Bskin%2B%2BPageletTestSkin/container/%40%40default.html">Login</a>
  </body>
</html>

再次调用登出URL而不带查询参数将导致一个确认页面,告知登出成功。

>>> browser2.open(logout_url.split('?')[0])
>>> print(browser2.url)
https://127.0.0.1/++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://127.0.0.1/++skin++PageletTestSkin/container/logout.html/@@login.html?nextURL=http%3A//127.0.0.1/%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。)将视图类 SessionCredentialsLoginFormz3c.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 (19.6 kB 查看哈希值)

上传时间

构建分布

z3c.authviewlet-2.0-py3-none-any.whl (20.0 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面