跳转到主要内容

基于请求头进行身份验证的PAS插件

项目描述

此PAS插件读取请求头并使用它们进行身份验证。类似于由Apache或nginx等前端Web服务器设置的SAML头。

功能

在Plone中安装时,插件被添加到PluggableAuthService。它注册了几个插件类型

  • 挑战插件

  • 提取插件

  • 身份验证插件

  • 属性插件

  • 角色插件

您可以通过编辑插件属性在ZMI(Zope管理接口)中配置它们。

安装

通过将其添加到您的buildout中安装pas.plugins.headers

[buildout]

...

eggs =
    pas.plugins.headers

然后运行bin/buildout。启动Plone并在附加组件控制面板中安装插件。

兼容性

本插件已在Plone 4.3、5.1和5.2(Python 2.7和3.7)上进行测试,确保其兼容性。

纯Zope?

不,本插件在纯Zope中无法使用。理论上,如果你首先安装了Products.PluggableAuthServiceProducts.GenericSetup,则可能会工作。但那样的话,你已经几乎拥有一个CMF网站了。

手动配置

您可以通过访问ZMI(Zope管理接口)来配置此插件。转到Plone ZMI中的acl_usersPluggableAuthService)文件夹。点击request_headers插件。转到“属性”选项卡。

以下是可以编辑的属性

userid_header:

用作用户ID的头部。

roles_header:

用作当前用户角色的头部。这可以提供多个角色:它会在空格处分割。

allowed_roles:

允许的角色。在roles_header中允许的角色。任何其他在头部中存在的角色都将被忽略。当为空时:所有角色都被接受,即使该角色在Plone中未知。头部中的角色和allowed_roles属性中的角色将进行小写比较。报告的角色使用allowed_roles的_case_。例如,如果头部包含PUPIL rootallowed_roles包含Pupil Teacher,则报告的角色将是仅Pupil

required_headers:

必需的头部。如果没有这些头部,提取插件不会提取头部,因此用户不会被认证。这些头部在请求中可以具有空值,只要它们都存在。

deny_unauthorized:

拒绝未经授权的访问。默认:false。当此为true且用户未经授权时,Challenge插件停止并显示一个难看的错误。当false时,Challenge插件将检查redirect_url

redirect_url:

未经授权时重定向到的URL。如果为空,则没有效果。如果已设置,Challenge插件将未经授权的用户重定向到此URL。通常您会配置您的前端服务器(nginx、Apache)在此URL上强制执行SAML或CAS登录。此插件定义的headerlogin页面可能是一个好URL。我们将redirect_url视为相对于Plone网站根目录的相对URL,除非它是一个完整URL。如果deny_unauthorized为true,则此选项被忽略。

memberdata_to_header:

从成员数据属性到请求头部的映射,每行一个。格式:propname|header。或者:propname|header|parser。有关解析器的信息,请参阅解析器部分。您还可以组合多个头部:propname|header_with_firstname header_with_lastname

create_ticket:

使用plone.session创建认证票据(__ac cookie)。默认:false。在读取头部时,此选项会检查Plone是否知道此用户。如果是这样,我们将创建一个认证票据。然后您可以让您的前端服务器(nginx、Apache)只为某些URL设置头部,而不是为所有URL设置。请注意,这不会适用于root Zope用户,并且它不会接管属性和角色。有关更多信息,请参阅问题6

default_roles:

当用户通过此插件成功认证时,添加到用户默认的角色。您始终自动获得认证角色。但您可能希望给每个人分配成员角色。这不会与允许的角色进行比较。

通过GenericSetup进行配置

该包包含一个GS(通用设置)导入步骤,其ID为pas.plugins.headers。在您插件的GS配置文件中,它会查找一个名为pas.plugins.headers.json的文件。此文件必须包含一个JSON字符串。完整示例

{
    "purge": true,
    "allowed_roles": [
        "Member",
        "Zebra"
    ],
    "create_ticket": true,
    "default_roles": [
        "Member"
    ],
    "deny_unauthorized": true,
    "memberdata_to_header": [
        "uid|HEADER_uid|lower",
        "fullname|HEADER_firstname HEADER_lastname"
    ],
    "redirect_url": "https://maurits.vanrees.org",
    "required_headers": [
        "uid",
        "test"
    ],
    "roles_header": "roles",
    "userid_header": "uid"
}

一些注意事项

  • 当内容无法解析为JSON或结果不是一个字典时,将引发一个ValueError

  • purge是可选的。当它为true时,在处理文件剩余部分之前将恢复默认设置。

  • purge仅对整个文件有效。它不在单个列表中工作。因此,您不能添加一个必需的标题并保留当前的标题。您需要指定它们全部。

  • 键是您在ZMI中看到的属性。

  • 当使用未知键时,它将被静默忽略。

  • memberdata_to_header中,导入器不会检查解析器是否已注册。

解析器

memberdata_to_header属性中,您可以使用解析器。例如

age|HEADER_age|int

当获取当前用户的属性时,属性插件将计算age属性。它读取HEADER_age标题,这可能给出一个如'42'的字符串。然后它调用int解析器将其转换为整数42

注意:属性插件是当前唯一使用解析器的部分。因此,在获取例如用户ID时不会使用它。

如果您指定了一个不存在的解析器,则解析器将被忽略,并且您将得到未修改的标题值。

一些基本的解析器可用

bool:

返回True或False。当小写标题值的首个字符为y/j/t/1时,解析器返回True,否则返回False。

int:

返回一个整数。当解析为整数失败时,它返回零。

lower:

返回小写值。

upper:

返回大写值。

split:

按空白字符拆分值,因此您得到一个列表。

您可以注册自己的解析器

def extra_parser(value):
    return value + ' extra'

from pas.plugins.headers.parsers import register_parser
register_parser('extra', extra_parser)

注意:当您覆盖现有解析器时,您将收到警告。

贡献

支持

如果您遇到问题,请通过在跟踪器中添加问题来通知我们:https://github.com/collective/pas.plugins.headers/issues

许可证

该项目受GPLv2许可协议保护。

贡献者

变更日志

1.5.0 (2022-01-06)

  • 添加了对作为凭据重置插件的支撑。当用户注销时,调用此部分。[maurits]

1.4.0 (2021-12-14)

  • 添加了选项default_roles。当用户通过此插件成功认证时,将赋予这些角色。您始终自动获得已认证角色。但您可能希望赋予每个人成员角色。这不会与允许的角色进行检查。[maurits]

1.3.2 (2021-12-02)

  • 添加了tox.ini,使用GitHub Actions,使用Plone 4.3、5.1、5.2、6.0进行测试。[maurits]

1.3.1 (2020-04-03)

  • Python 3:当redirect_url意外地是字节时,在比较之前将其转换为本地字符串。[maurits]

  • 修复了redirect_url不以斜杠开头的问题。当值为headerlogin时,我们会重定向到https://127.0.0.1:8080/Ploneheaderlogin。[maurits]

1.3.0 (2020-03-26)

  • 我们要求six>=1.12.0,因为我们使用了ensure_str。请注意,Plone 4.3和5.1目前锁定在较旧版本。[maurits]

  • 修复了当 redirect_url 以斜杠开头时的 NotFound 错误,例如 /headerlogin。在本地开发中,它将重定向到 Zope 根目录下的 /headerlogin,那里不存在。现在我们始终将 redirect_url 视为相对于 Plone 网站根目录的相对路径,除非它是完整 URL。 [maurits]

  • 修复了 exportimport 总是设置原生字符串的问题。在 Python 3 中,我们设置了字节,这是错误的。在成员属性中修复了相同的问题。 [maurits]

1.2.0 (2020-02-24)

  • 当挑战插件重定向时,添加了 came_from 查询参数。 [maurits]

  • 添加了 headerlogin 页面。该页面将重定向到 came_from 查询参数、引用或导航根目录。您可以在 redirect_url 选项中使用它,并让您的前端服务器强制在它上面执行 SAML 或 CAS 登录。当用户到达此页面并且仍然是匿名用户时,则显然 SAML/CAS 没有工作。然后我们重定向到标准登录页面。我们注意避免登录和 headerlogin 页面之间的重定向循环。 [maurits]

  • 添加了 create_ticket 选项。在读取标题时,它检查 Plone 是否知道此用户。如果是这样,我们使用 plone.session 创建一个身份验证票据(__ac cookie)。然后您可以让您的前端服务器只为某些 URL 设置标题,而不是为所有 URL 设置。请注意,这对根 Zope 用户不起作用,并且它不会接管属性和角色。请参阅 问题 6。 [maurits]

1.1.0 (2020-02-19)

  • 添加了 Plone 5.2、Python 3 兼容性。 [maurits]

1.0.1 (2019-11-01)

  • 替换了在 Plone 5.2 中已删除的 Globals 的导入。 [maurits]

1.0.0 (2019-04-25)

  • 发布最终版本,没有更改。 [maurits]

1.0.0a2 (2018-08-03)

  • 记录了我们的 GenericSetup 导入步骤。与大多数导入器不同,它读取名为 pas.plugins.headers.jsonjson 文件。 [maurits]

1.0.0a1 (2018-08-03)

  • 首次发布。 [maurits]

项目详情


下载文件

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

源分布

pas.plugins.headers-1.5.0.tar.gz (38.3 kB 查看散列)

上传时间

构建分布

pas.plugins.headers-1.5.0-py2.py3-none-any.whl (43.4 kB 查看散列)

上传时间 Python 2 Python 3