基于请求头进行身份验证的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.PluggableAuthService和Products.GenericSetup,则可能会工作。但那样的话,你已经几乎拥有一个CMF网站了。
手动配置
您可以通过访问ZMI(Zope管理接口)来配置此插件。转到Plone ZMI中的acl_users(PluggableAuthService)文件夹。点击request_headers插件。转到“属性”选项卡。
以下是可以编辑的属性
- userid_header:
用作用户ID的头部。
- roles_header:
用作当前用户角色的头部。这可以提供多个角色:它会在空格处分割。
- allowed_roles:
允许的角色。在roles_header中允许的角色。任何其他在头部中存在的角色都将被忽略。当为空时:所有角色都被接受,即使该角色在Plone中未知。头部中的角色和allowed_roles属性中的角色将进行小写比较。报告的角色使用allowed_roles的_case_。例如,如果头部包含PUPIL root和allowed_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许可协议保护。
贡献者
Maurits van Rees,m.van.rees@zestsoftware.nl
变更日志
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.json 的 json 文件。 [maurits]
1.0.0a1 (2018-08-03)
首次发布。 [maurits]
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源分布
构建分布
pas.plugins.headers-1.5.0.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | af50ce01e36be2698bc4f1d090e45fe585bf4ee9bab70cf2be16eb05ad86fbf6 |
|
MD5 | 876fbfbebe10ca10d430f9133e7b42c1 |
|
BLAKE2b-256 | 372c0779a4759251af56c66161446cda93c0110e069ca7c2f2f5dd7ac89eee4f |
哈希值 for pas.plugins.headers-1.5.0-py2.py3-none-any.whl
算法 | 散列摘要 | |
---|---|---|
SHA256 | 2aee21457263b51da387eebe34b89d86573b96d54dad8eada1888bc1c499b4b3 |
|
MD5 | ad6b5c1e63f4e3216eb05a08ae7749cf |
|
BLAKE2b-256 | a75041f65dc4f1aae1d150f8865ae1bba333821ddcb7a3b0304706d1feb858eb |