nitecon / zfcuser-ldap
Zend Framework 2 ZfcUser LDAP 认证
Requires
- php: >=5.3.3
- zendframework/zendframework: 2.*
- zf-commons/zfc-user: 0.1.*
This package is not auto-updated.
Last update: 2024-09-14 15:16:27 UTC
README
为提供 LDAP 认证扩展的 Zend Framework ZfcUser
特性
- 提供 LDAP 认证的适配器链。
- 允许通过用户名和电子邮件地址登录
- 提供配置的 LDAP 服务器之间的自动故障转移
- 为 BjyAuthorize 提供 identity 提供者
待办/进行中
- 添加在 ldap 中注册用户的能力
- 允许在 ldap 中重置密码
- 为 ZfcRbac 提供身份提供者
重建通知
如果您不想测试 WIP,请确保使用当前发布版本:1.1.0,如下所述的 composer 安装中。虽然我会尽量保持 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不受此更改的影响,您应该能够像以前一样使用身份提供者。
设置
以下步骤是使此模块正常工作的必要步骤。
-
运行
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,您只需将以下内容添加到您的Application的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中。如果您没有数据目录,请创建一个,应用程序将自动尝试创建它。但是,如果无法创建文件夹,则会出错。将来将进行更改,允许用户指定日志位置,并完全禁用日志记录。
应用程序配置
请确保在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。