在Plone中进行身份验证时自动创建PAS用户
项目描述
在Plone登录时自动生成成员。
变更历史
2.1.1 (2017-02-01)
文档RST修复 [tomgross]
2.1 (2017-02-01)
如果配置属性设置为原始属性则不会失败 [davidjb]
更新默认构建为Plone 5.0 [tomgross]
支持周期性用户属性更新 [sebasgo]
排除用户创建和更新从plone.protect的CSRF保护 [sebasgo]
在Plone 5.1上测试 [tomgross]
2.0 (2016-01-14)
添加来自WSA的挑战头和替换模式 [tomgross]
Plone 4.1 - 5.0兼容性 [tomgross]
将测试转移到plone.app.testing [tomgross]
允许除了Member之外的其他默认角色 [Sebastian Gottfried]
1.1 (2014-11-06)
移除触发UserLoggedInEvent(不应在PAS插件中执行) [gweis]
1.0 (2014-02-26)
让PAS决定在哪里存储用户属性。允许例如Membrane在用户对象本身上存储属性。[gweis]
使更新用户属性可选。[gweis]
0.9 (2014-02-04)
将密码生成函数移至实例方法。这允许通过从插件、请求等信息中获取的信息来覆盖此函数和执行性能操作。[davidjb]
在用户认证时更新用户属性。这处理了用户详情可能改变的情况(如姓名、电子邮件地址等)。
允许其他 PAS 插件通过在认证时调用 updateCredentials 来处理凭据。这允许现有的会话或 Cookie 插件(实现 ICredentialsUpdatePlugin)接管处理用户的认证。
确保在 Plone 4.1+ 上通过测试。
0.8b1(2010-11-04)
将本地角色的设置因子化到 ShibbolethPermissions
触发 UserLoggedInEvent
添加了 challenge-plugin
0.8a1(2010-04-06)
authzMappings 需要始终是一个持久列表 [tom_gross]
从旧式产品 0.7 复制 [tom_gross]
详细文档
概述
在 Zope 中接受基于 Apache 的认证并创建 Plone 用户。
AutoUserMakerPasPlugin 是从 apachepas 开发的一个 PAS 插件,它允许 Zope 将认证问题委托给 Apache,并在 Apache 允许其通过时自动创建用户。使用 AutoUserMakerPasPlugin,您可以配置您的 Plone 网站,使其任何已知于您的 LDAP、Kerberos、Shibboleth 或 Cosign(又名 WebAccess)系统–实际上任何具有 Apache 认证模块的系统–都可以使用他的企业级凭据透明地登录。
如果您只想让少数用户能够登录到您的网站,不要使用自动用户创建器;坚持使用 apachepas,并手动创建您的几个用户。如果您想让具有企业凭据的任何人都能进行认证,请继续阅读。
需求
Plone 4.1 到 5.1 已测试并得到支持
我使用 Shibboleth 进行了测试,目前是 2.0 服务提供商。
安装
解压缩 AutoUserMakerPASPlugin.zip 文件到 $INSTANCE_HOME/Products。
重启 Zope。
安装插件
如果您使用 Plone…
转到您的-plone-site -> 网站设置 -> 添加/删除产品,并安装 AutoUserMakerPASPlugin。
如果您不使用 Plone…
在 Zope 管理界面中,导航到您的-plone-site -> acl_users。
将自动用户创建器添加到文件夹中。
导航到您的-plone-site -> acl_users -> 插件 -> 认证插件。
转到您新创建的 Auth User Make 实例的激活选项卡,并打开认证和提取。
设置所需的 Apache 指令。例如
# Some Linux distributions (e.g., Debian Etch and Red Hat Enterprise
# Linux AS Release 4) have default settings which prevent the header
# rewrites below from working. Fix that:
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
RewriteEngine On
# Grab the remote user as environment variable.
# (This RewriteRule doesn't actually rewrite anything URL-wise.)
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule .* - [E=RU:%1]
# Put the username into a request header:
RequestHeader set X_REMOTE_USER %{RU}e
# For Shibboleth SP 2.0, you must also set HTTP headers, if you want
# account data populated.
#RequestHeader set SHIB_PERSON_COMMONNAME %{displayName}e
#RequestHeader set SHIB_INETORGPERSON_MAIL %{mail}e
#RequestHeader set SHIB_ORGPERSON_LOCALITY %{l}e
#RequestHeader set SHIB_ORGPERSON_STATE %{st}e
#RequestHeader set SHIB_ORGPERSON_C %{c}e
# Don't send shib stuff to plone
RewriteCond %{REQUEST_URI} !^/(shibboleth-(sp|idp)|Shibboleth.sso|SAML)
# Do the typical VirtualHostMonster rewrite:
RewriteRule ^/port_8080(.*) https://:8080/VirtualHostBase/http//:80/VirtualHostRoot/_vh_port_8080/$1 [L,P]
我在我的 Apache 2.2 和 Shibboleth 1.3 开发系统的虚拟接口上使用了以下内容(Alan Brenner)
Listen 192.168.191.1:80
<VirtualHost 192.168.191.1:80>
ServerName alan.ithaka.org
DocumentRoot /usr/local/apache-httpd-2.2.4/htdocs
ProxyRequests Off
ProxyPass /server-status !
ProxyPass /server-info !
ProxyPass /index.php !
ProxyPass /Shibboleth.sso !
ProxyPass /shibboleth-sp !
ProxyPass /shibboleth-idp !
ProxyPass /php !
ProxyPass / http://127.0.0.1:8253/VirtualHostBase/http/alan.ithaka.org:80/test/VirtualHostRoot/
LoadModule mod_shib /usr/local/shibboleth-sp-1.3/libexec/mod_shib_22.so
ShibSchemaDir /usr/local/shibboleth-sp-1.3/share/xml/shibboleth
ShibConfig /usr/local/shibboleth-sp-1.3/etc/shibboleth/shibboleth.xml
ShibURLScheme http
<Location /php>
AuthType shibboleth
ShibRedirectToSSL 443
# An index.php like:
#<html><head><title>shib test</title></head><body><?php phpinfo(); ?></body></html>
# is helpful to validate security, and see what values shib is setting.
</Location>
</VirtualHost>
<Location /shibboleth-idp/SSO>
AuthType Basic
AuthName Test
AuthUserFile /usr/local/apache-httpd-2.2.4/conf/users
require valid-user
</Location>
<IfModule !mod_jk.c>
LoadModule jk_module modules/mod_jk.so
JkShmFile /usr/local/apache-httpd-2.2.4/logs/jk-runtime-status
JkWorkersFile /usr/local/apache-tomcat-5.5.23/conf/jk/workers.properties
JkLogFile /var/log/httpd/mod_jk.log
</IfModule>
JkLogLevel emerg
JkMount /shibboleth-idp/* ajp13
JkMount /jsp-examples ajp13
JkMount /jsp-examples/* ajp13
JkMount /tomcat-docs ajp13
JkMount /tomcat-docs/* ajp13
JkMount /admin ajp13
JkMount /admin/* ajp13
Listen 443
<VirtualHost 192.168.191.1:443>
DocumentRoot "/usr/local/apache-httpd-2.2.4/htdocs"
ServerName alan.ithaka.org
ServerAdmin alan.brenner@ithaka.org
ErrorLog /usr/local/apache-httpd-2.2.4/logs/error_log.443
TransferLog /usr/local/apache-httpd-2.2.4/logs/access_log.443
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /usr/local/shibboleth-sp-1.3/etc/shibboleth/idp.crt
SSLCertificateKeyFile /usr/local/shibboleth-sp-1.3/etc/shibboleth/idp.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule .* - [E=RW_RU:%1]
RequestHeader set X_REMOTE_USER %{RW_RU}e
RewriteCond %{REQUEST_URI} !^/(shibboleth-(sp|idp)|Shibboleth.sso|SAML|WAYF|server-(status|info)|index.php|php)
RewriteRule ^/(.*) http://127.0.0.1:8253/VirtualHostBase/https/alan.ithaka.org:443/test/VirtualHostRoot/$1 [L,P]
<Location />
AuthType shibboleth
ShibRequireSession Off
require shibboleth
</Location>
</VirtualHost>
Listen 8443
<VirtualHost 192.168.191.1:8443>
ErrorLog /usr/local/apache-httpd-2.2.4/logs/error_log.8443
TransferLog /usr/local/apache-httpd-2.2.4/logs/access_log.8443
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
SSLVerifyClient optional_no_ca
SSLVerifyDepth 10
SSLOptions +StdEnvVars +ExportCertData
SSLCertificateFile /usr/local/shibboleth-sp-1.3/etc/shibboleth/idp.crt
SSLCertificateKeyFile /usr/local/shibboleth-sp-1.3/etc/shibboleth/idp.key
ProxyRequests Off
</VirtualHost>
我使用此(Alan Brenner)用于 Apache 2.2 和 Shibboleth 2.0(请参阅https://spaces.internet2.edu/display/SHIB2/IdPSPLocalTestInstall以获取有关 Shibboleth 方面的更完整指令集)
Include /etc/shibboleth/apache22.config
<VirtualHost *:80>
ServerName alan.ithaka.org
ServerAdmin alan.brenner@ithaka.org
DocumentRoot /Library/WebServer/Documents
ProxyRequests Off
ProxyPass /server-status !
ProxyPass /server-info !
ProxyPass /index.php !
ProxyPass / http://127.0.0.1:8253/VirtualHostBase/http/alan.ithaka.org:80/test/VirtualHostRoot/
</VirtualHost>
Listen 443
<VirtualHost 172.16.209.1:443>
DocumentRoot "/Library/WebServer/Documents"
ServerName alan.ithaka.org:443
ServerAdmin alan.brenner@ithaka.org
ErrorLog "/var/log/apache2/error_log"
TransferLog "/var/log/apache2/access_log"
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/etc/apache2/server.crt"
SSLCertificateKeyFile "/etc/apache2/server.key"
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/Library/WebServer/CGI-Executables">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "/var/log/apache2/ssl_request_log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule .* - [E=RW_RU:%1]
RequestHeader set X_REMOTE_USER %{RW_RU}e
RequestHeader set SHIB_PERSON_COMMONNAME %{displayName}e
RequestHeader set SHIB_INETORGPERSON_MAIL %{mail}e
RequestHeader set SHIB_ORGPERSON_LOCALITY %{l}e
RequestHeader set SHIB_ORGPERSON_STATE %{st}e
RequestHeader set SHIB_ORGPERSON_C %{c}e
RewriteCond %{REQUEST_URI} !^/(shibboleth-sp|server-(status|info)|index.php|secure)
RewriteRule ^/(.*) http://127.0.0.1:8253/VirtualHostBase/https/alan.ithaka.org:443/test/VirtualHostRoot/$1 [L,P]
<Location />
AuthType shibboleth
ShibRequireSession On
require shibboleth
</Location>
</VirtualHost>
<VirtualHost 172.16.60.1:443>
DocumentRoot "/Library/WebServer/Documents"
ServerName alanidp.ithaka.org:443
ServerAdmin alan.brenner@ithaka.org
ErrorLog "/var/log/apache2/error_idp_log"
TransferLog "/var/log/apache2/access_idp_log"
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/etc/apache2/server_idp.crt"
SSLCertificateKeyFile "/etc/apache2/server_idp.key"
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/Library/WebServer/CGI-Executables">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /idp/ ajp://127.0.0.1:8009/idp/
<Location /idp/Authn/RemoteUser>
AuthType Basic
AuthName "IdPTest"
AuthUserfile /etc/apache2/pass
require valid-user
</Location>
</VirtualHost>
注意:对于 Shibboleth 2,我不得不使用不同的主机作为身份提供者。
Shibboleth 更改
对于 Shibboleth 1.3,将服务提供商的 shibboleth.xml 文件中的 MemorySessionCache 更改为增加值,以避免会话在 30 分钟后过期
<MemorySessionCache cleanupInterval="28800" cacheTimeout="60" AATimeout="30" AAConnectTimeout="15" defaultLifetime="28800" retryInterval="300" strictValidity="false" propagateErrors="false"/>
在此处,您以秒为单位增加 cleanupInterval 和 defaultLifetime 值。
对于 Shibboleth 2.0,将身份提供者的 handler.xml 中的 LoginHandler 条目更改为增加值,以避免会话在 30 分钟后过期
<LoginHandler xsi:type="RemoteUser" authenticationDuration="480">
在此处,您添加 authenticationDuration 值(以分钟为单位)。
配置
具有域名用户名
如果您的 Apache 设置包括用户名中的域名,AutoUserMakerPASPlugin 默认会将其删除。例如,如果 Apache 将 X_REMOTE_USER 设置为 “fred@example.com”,AutoUserMakerPASPlugin 将将其缩短为 “fred”。如果您不希望 AutoUserMakerPASPlugin 执行此操作(例如,如果您使用的是跨域授权系统如 Shibboleth,这可能导致名称冲突)…
在 ZMI 中,点击 acl_users 中的 AutoUserMakerPASPlugin 实例。
点击“不要从用户名中剥离域名”。
点击保存。
也可以通过选择“从以下域的所有用户名中剥离域名”按钮,并在该按钮下方的输入框中输入域名,然后点击保存来设置从特定DNS域名中剥离名称。
标题映射
如果您正在使用Shibboleth(http://shibboleth.internet2.edu/),则可以从Apache发送额外数据到Zope。在每种输入类型的字段中配置Shibboleth服务提供商提供的数据,然后点击保存。这将允许AutoUserMakerPASPlugin填充基本Plone用户属性(全名、电子邮件等)。可以通过在单独的行上列出它们来搜索每个属性的环境变量。将使用找到的第一个值。
分配Plone角色、组或现有用户
AutoUserMakerPASPlugin可以将传入的属性映射到Plone角色、组和已存在的用户。
在选项卡的底部附近添加要检查的环境变量到输入框中,然后点击保存。
点击AuthZ选项卡,在添加角色映射部分中,输入应选择传入用户的正则表达式。您不需要填写所有源字段,但至少应该有一个。空白字段匹配,因此如果没有给出模式,则所有新用户将被指定为在角色、用户和组列中指定的。
选择角色、现有用户或一个或多个组以分配给与给定模式匹配的用户。
点击保存。
一旦存在映射,将有一个区域可以编辑现有的映射,包括删除它。
仅允许某些用户进入
如果您只想允许Apache识别的用户子集进入...
在ZMI中,点击您的ApacheAuthPluginHandler实例。
点击属性选项卡。
在required_roles字段中输入“Member”。
点击保存更改。
使用Plone中的用户和组管理页面创建您想允许的用户。
您尚未添加的用户仍然能够满足Apache的登录提示,但不会被Plone识别。
设计原理(技术性,仅供好奇者参考)
用户创建
我们选择实际上在PAS中创建和存储用户,而不是仅仅假装他们存在。如果我们只是假装,那么当您转到‘your-plone-site/prefs_users_overview’并点击“显示所有”时,用户就不会出现。(在我们的情况下,编写‘IUserEnumerationPlugin’是不可能的,因为企业用户存储不是Zope关心的;Apache是唯一与用户存储通信的东西。)
角色分配
我们可以通过两种方式给用户提供成员角色(这是Plone将他们视为一等公民所必需的):(1)一个‘IRolesPlugin’,它会简单地假装每个人都有成员角色;(2)实际上为每个用户分配成员角色,并将分配存储在ZODB中(或者更准确地说,在任何活跃的‘IRoleAssignerPlugin’选择的存储位置)。我们选择了(2),这样您以后可以卸载Auto Member Maker,并且您的用户仍然可以正常工作。如果我们做了(1),那么如果您停止使用Auto Member Maker,您将需要手动将成员角色分配给每个用户。
测试
要运行AutoUserMakerPASPlugin测试,使用标准的Zope测试运行器
$INSTANCE_HOME/bin/zopectl test -s Products.AutoUserMakerPASPlugin
致谢
apachepas
最初由Rocky Burt(rocky AT serverzen.com)代表“Zest Software”开发:http://zestsoftware.nl。
版本 1.1,由 WebLion 的 Erik Rose 编写,http://weblion.psu.edu/。
AutoMemberMakerPASPlugin
本产品由宾夕法尼亚州立大学 WebLion 小组的 Erik Rose 开发。
AutoUserMakerPASPlugin
Ithaka Harbors, Inc. 的 Alan Brenner,在 Andrew W. Mellon 基金会信息技术研究项目指导下,结合了 apachepas 和 AutoMemberMaker,并增加了用户、组和角色映射,以及用户级别共享的支持。我还添加了一些测试。我要感谢 psych.ucla.edu 的 Paul Yuergens、pku.edu.cn 的 Li Cheng 和 alfa.it 的 Yuri <yurj> 对其进行了测试,以及 seas.ucla.edu 的 Alex Man 跟踪了 Shibboleth 1.3 会话过期原因。
贡献者
Tom Gross,作者
David Beitey,贡献者
Sebastian Gottfried,贡献者
项目详情
Products.AutoUserMakerPASPlugin-2.1.1.tar.gz 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | dcb17f7444df39252e5c9c3a055c8ab5e30dda095d8e813d88b5d4dbf92e027f |
|
| MD5 | fc6483d86e20c3b59a3ff0a6620dcbff |
|
| BLAKE2b-256 | b02ded3e94fbdd1f33a406638d938e4bf2ff08353682d35446cecad48c5c6921 |