跳转到主要内容

在Plone中进行身份验证时自动创建PAS用户

项目描述

https://travis-ci.org/collective/Products.AutoUserMakerPASPlugin.png https://coveralls.io/repos/github/collective/Products.AutoUserMakerPASPlugin/badge.svg?branch=master

在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 服务提供商。

安装

  1. 解压缩 AutoUserMakerPASPlugin.zip 文件到 $INSTANCE_HOME/Products。

  2. 重启 Zope。

  3. 安装插件

    如果您使用 Plone…

    1. 转到您的-plone-site -> 网站设置 -> 添加/删除产品,并安装 AutoUserMakerPASPlugin。

    如果您不使用 Plone…

    1. 在 Zope 管理界面中,导航到您的-plone-site -> acl_users。

    2. 将自动用户创建器添加到文件夹中。

    3. 导航到您的-plone-site -> acl_users -> 插件 -> 认证插件。

    1. 转到您新创建的 Auth User Make 实例的激活选项卡,并打开认证和提取。

  4. 设置所需的 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,这可能导致名称冲突)…

  1. 在 ZMI 中,点击 acl_users 中的 AutoUserMakerPASPlugin 实例。

  2. 点击“不要从用户名中剥离域名”。

  3. 点击保存。

也可以通过选择“从以下域的所有用户名中剥离域名”按钮,并在该按钮下方的输入框中输入域名,然后点击保存来设置从特定DNS域名中剥离名称。

标题映射

如果您正在使用Shibboleth(http://shibboleth.internet2.edu/),则可以从Apache发送额外数据到Zope。在每种输入类型的字段中配置Shibboleth服务提供商提供的数据,然后点击保存。这将允许AutoUserMakerPASPlugin填充基本Plone用户属性(全名、电子邮件等)。可以通过在单独的行上列出它们来搜索每个属性的环境变量。将使用找到的第一个值。

分配Plone角色、组或现有用户

AutoUserMakerPASPlugin可以将传入的属性映射到Plone角色、组和已存在的用户。

  1. 在选项卡的底部附近添加要检查的环境变量到输入框中,然后点击保存。

  2. 点击AuthZ选项卡,在添加角色映射部分中,输入应选择传入用户的正则表达式。您不需要填写所有源字段,但至少应该有一个。空白字段匹配,因此如果没有给出模式,则所有新用户将被指定为在角色、用户和组列中指定的。

  3. 选择角色、现有用户或一个或多个组以分配给与给定模式匹配的用户。

  4. 点击保存。

一旦存在映射,将有一个区域可以编辑现有的映射,包括删除它。

允许用户共享内容

如果已安装ShibbolethPermissions,则可以在配置选项卡的最后两个输入字段中添加项目,以设置用户可以用来共享内容的值。在左侧输入框中输入用于分配角色或设置用户属性的相同类型的环境变量名称。在右侧框中输入用户将看到的与左侧框中同一行的变量的标签,并点击保存。

仅允许某些用户进入

如果您只想允许Apache识别的用户子集进入...

  1. 在ZMI中,点击您的ApacheAuthPluginHandler实例。

  2. 点击属性选项卡。

  3. 在required_roles字段中输入“Member”。

  4. 点击保存更改。

  5. 使用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 (56.5 kB 查看哈希值)

上传时间 源代码

支持

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