marks12 / zfcuser-ldap
Zend Framework 2 ZfcUser LDAP 认证。这是一个非官方版本。请使用 Nitecon/zfcuser-ldap
Requires
- php: >=5.3.3
- bjyoungblood/bjy-authorize: 1.*
- doctrine/doctrine-orm-module: 0.*
- zendframework/zendframework: 2.*
- zf-commons/zfc-user: 1.2.*
Requires (Dev)
- satooshi/php-coveralls: ~0.6
- squizlabs/php_codesniffer: 1.4.*
This package is not auto-updated.
Last update: 2024-09-24 07:17:06 UTC
README
!注意 - 这是一个非官方版本,请使用 Nitecon/zfcuser-ldap Travis 添加
Zend Framework ZfcUser 扩展,提供 LDAP 认证
特性
- 提供 LDAP 认证的适配器链。
- 允许通过用户名和电子邮件地址登录
- 在配置的 LDAP 服务器之间提供自动故障转移
- 为 BjyAuthorize 提供 ID 提供者
待办事项/进行中
- 添加在 ldap 中注册用户的能力
- 允许在 ldap 中重置密码
- 为 ZfcRbac 提供 ID 提供者
重建通知
如果您不想测试 WIP,请确保使用以下 composer 设置中的当前发布版本:1.1.0。虽然我会尽量保持 master 分支尽可能稳定,但仍然有可能破坏您的东西。
由于 ZfcRbac 需要在用户实体中实现 getRoles,因此我将为此适配 BjyAuthorize。顺便说一下,角色可能不会被插入到数据库中,因为它们可能会更改,而将它们存储在会话中似乎更有意义。
WIP
目前 master 分支是功能性的,但没有文档。我将尽力为 master 分支添加文档,并在接下来的一个星期左右添加一个新的版本。然而,工作生活并不总是仁慈的,但我将尽快完成。
整个模块是从头开始重建的。我已经尽力保持向后兼容性,但是为了获得一些修正,我不得不破坏当前的发布版本。
什么被破坏了?您现在需要在 zfcuser 用户表中有一个名为 roles
的列。我目前将其设置为 blob,因为我的 ldap 用户不适合文本或长文本。除此之外,还有一些新功能。
在模块下(在您的 vendor 目录中)您将找到一个新的配置文件 zfcuserldap.global.php.dist
。您需要将此文件复制并重命名为 config/autoload/zfcuser.global.php
,或者将其添加到您自己的全局文件中。该文件包含模块的新配置设置,它还包括一个名为:auto_insertion
的新功能。如果启用自动插入(默认),则在触发认证并成功后,用户将被自动添加到您的 zfcuser 用户表中。如果您选择禁用此功能,则仍然可以使用模块,但是您需要首先在您的数据库表中创建用户。这提供了之前不可用且仅通过 bjyauthorize 角色可用的额外限制。
另一个相当大的变化是,模块现在具有一个合适的链式认证适配器和可调整的实体。以前您必须设置
'auth_adapters' => array( 100 => 'ZfcUserLdap\Authentication\Adapter\Ldap' ),
现在您可以更有效地拥有类似
'auth_adapters' => array( 110 => 'ZfcUserLdap\Authentication\Adapter\LdapAuth', 100 => 'ZfcUser\Authentication\Adapter\Db' ),
请记住,密码不会存储在数据库中,因为我倾向于允许这种情况发生,所以如果您禁用 zfcuserldap,您的用户仍然存在,但是您需要重置密码。
由于现在它运行在具有插入操作的数据库上,这也意味着您必须实际上指定前面提到的用户实体!默认情况下,您可以设置以下 zfcuser 配置
'user_entity_class' => 'ZfcUserLdap\Entity\User',
您始终可以覆盖实体,但请记住,您还需要在实体中包含 rawLdapObj 属性及其 getter/setter,以及相关的表列 raw_ldap_obj
BjyAuthorize不受此更改的影响,您应该能够像以前一样使用身份提供者。
设置
在您的 module/application.config.php 中添加以下模块:
'DoctrineModule',
'DoctrineORMModule',
'BjyProfiler',
'ZfcBase',
'ZfcUser',
'BjyAuthorize',
'ZfcUserLdap',
以下步骤是使此模块正常工作的必要步骤
-
运行
php composer.phar require nitecon/zfcuser-ldap:1.1.0
-
将
ZfcUserLdap
添加到启用模块列表(需要激活 ZfcUser) -
根据以下链接将 Zend Framework LDAP 配置添加到您的 autoload 中,键为 'ldap':http://framework.zend.com/manual/2.1/en/modules/zend.ldap.introduction.html
以下是一个配置示例,用于 configs/autoload/global.php 请确保您在此文件中不包含密码,我仅将其包含在此处以供说明
array( 'ldap' => array( 'server1' => array( 'host' => 's0.foo.net', 'username' => 'CN=user1,DC=foo,DC=net', 'password' => 'pass1', 'bindRequiresDn' => true, 'accountDomainName' => 'foo.net', 'baseDn' => 'OU=Sales,DC=foo,DC=net', ), 'server2' => array( 'host' => 's0.foo2.net', 'username' => 'CN=user1,DC=foo,DC=net', 'password' => 'pass1', 'bindRequiresDn' => true, 'accountDomainName' => 'foo.net', 'baseDn' => 'OU=Sales,DC=foo,DC=net', ), ) ),
BjyAuthorize 设置
要启用 ZfcUserLdap 模块上的 BjyAuthorize,您只需将以下内容添加到您的应用的 module.config.php 中
return array( // Your other stuff 'bjyauthorize' => array( // Using the authentication identity provider, which basically reads the roles from the auth service's identity 'identity_provider' => 'ZfcUserLdap\Provider\Identity\LdapIdentityProvider', 'ldap_role_key' => 'objectclass', 'role_providers' => array( /* here, 'guest' and 'user are defined as top-level roles, with * 'posixAccount' inheriting from user */ 'BjyAuthorize\Provider\Role\Config' => array( 'guest' => array(), 'user' => array('children' => array( 'person' => array(), 'posixAccount' => array(), )), ), ), 'guards' => array( 'BjyAuthorize\Guard\Route' => array( array('route' => 'zfcuser', 'roles' => array('posixAccount')), array('route' => 'zfcuser/logout', 'roles' => array('posixAccount')), array('route' => 'zfcuser/login', 'roles' => array('guest')), array('route' => 'zfcuser/register', 'roles' => array('guest')), // Below is the default index action used by the ZendSkeletonApplication array('route' => 'home', 'roles' => array('guest', 'person')), ), ) ), // More of your other stuff );
大多数项目应基于 BjyAuthorize 文档熟悉,但我将概述 ZfcUserLdap 正确运行的临界部分。
第一个重要部分是 'identity_provider' => 'ZfcUserLdap\Provider\Identity\LdapIdentityProvider',
。
下一部分是: 'ldap_role_key' => 'objectclass',
这直接映射到搜索返回的 ldap 对象。如果您想查看基于您的 ldap 服务器实际的对象,请查看 data/logs/ldap.log
。我已选择 objectclass
作为用于角色的键,但您可以使用任何顶级键,一些 ldap 团队提供类似 mycompanyrole
的管理角色键,其中包含用户当前拥有的实际角色的子键,在这种情况下,请将 ldap_role_key
设置为 mycompanyrole
最后部分是 BjyAuthorize 的 role_providers
键,因为 ldap 用户是动态的,并且并非所有用户始终具有相同的角色,我们使用 BjyAuthorize\Provider\Role\Config
角色提供者定义基线。访客和用户角色是必需的,因为 guest
表示未登录用户,而 user
表示已成功登录的用户,这样您就有能力为 ldap 上的每个人提供特定集的访问权限,并使用提供的角色限制对其他部分的访问。
现在我们来谈谈在 user
子节点中设置的基线。子键应 始终 映射到您选择的 ldap_role_key
元素中存在的现有数组键。由于 objectclass
是合理的 ldap 默认值,同样还有 person
和 posixAccount
,我决定使用它们作为基线。请记住,您可以在本节中添加任何角色,甚至让它们继承,唯一的限制是当用户登录时,IdentityProvider 将检查所选的基线角色,并将自动取消设置用户在键下具有的任何附加角色。这样做的原因是因为 BjyAuthorize 如果用户有它不知道的角色,就会变得疯狂。
祝您玩得开心,如果您有问题,请告诉我。
附加信息
请注意,根据上述配置示例,它显示了 2 个服务器被使用,这将允许在其中一个服务器宕机时自动故障转移。这不是必需的。您只需指定一个服务器,因此可以删除 'server2' 数组。
当前应用程序还将所有 LDAP 相关查询记录到 data/logs/ldap.log。如果您没有 data 目录,请创建一个,应用程序将自动尝试创建它。但是,如果它无法创建文件夹,则将出现错误。这将在未来更改,以允许用户指定日志位置,并完全禁用日志记录。
应用程序配置
请确保在 application.config.php 中启用 ZfcUser 和 ZfcUserLdap,如下所示
array( 'ZfcUser', 'ZfcUserLdap', /* It's important to load ZfcUser before ZfcUserLdap as ZfcUserLdap is an addon to ZfcUser */ );
ZfcUser 配置
对于初始版本,请确保在您的 zfcuser 配置中设置以下设置
array( 'enable_registration' => false, 'enable_username' => true, 'auth_adapters' => array( 100 => 'ZfcUserLdap\Authentication\Adapter\Ldap' ), 'auth_identity_fields' => array( 'username','email' ), ),
总结
在上面的配置中,如果愿意,可以将 auth_identity_fields 仅设置为电子邮件。然而,建议允许 LDAP 用户使用他们的 ldap uid 登录。但在此处应关闭 enable_registration,因为它会在用户尝试注册且无法在 LDAP 中创建实体时引起问题。
在模块中还需要进行一些错误处理,以及根据 zfcuser 模块的功能进行修改的能力。然而,目前这已被禁用,您将无法 更改 密码。
享受使用过程,如果您发现任何错误或问题,请为此模块添加 pull requests。