在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://127.0.0.1:8080/VirtualHostBase/http//127.0.0.1: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 |