2011-04-08 57 views
1

进出口新的Zend和到LDAP身份验证Apache中,所以我已经得到了真正的堆栈溢出... 我有什么:的Zend - 基本使用LDAP

  • LDAP服务器
  • 的Apache服务器
  • Zend的应用

我需要什么:

  • 在应用程序的任何页面,而用户 无权显示Apache的 基本认证提示
  • 如果登录名和密码 是LDAP服务器上正确的,那么 重定向到索引控制器。

我已经阅读了大量有关Zend_Auth的手册,关于authnz_ldap_module等,但无法解决给定的任务。 任何帮助 - 例如,解决方案,链接 - 将不胜感激!

回答

0

我最近完成了整个ACL过程,并对结果感到满意。下面是我实现的:

  1. 扩展Zend_ACL,并使用其构造函数中添加你的角色(包括继承关系)。

  2. 创建一个加载到引导中的动作助手。 (您需要尽早加载,以便您可以使用它的挂钩,如preDispatch)。

  3. 编辑要保护和调用新的ACL助手,传递的是要应用于此控制器的规则在每个控制器,例如在init()allow('member', 'edit);

真正的工作是做由行动助手。它有四个功能:

  • init() - 实例化新的ACL类,然后将其镜像电流控制器,
    即名称的新资源。 $this->_resource = $this->getRequest()->getControllerName())

  • preDispatch() - 使用Zend_Auth(或指定用户未登录的guest的默认值)获取当前用户类型。使用ACL,
    ,即$this->_acl->isAllowed($currentRole, $resource, $action)检查请求是否被允许。
    注意请求的操作成为ACL特权。

  • allow() - 这只是代理到ACL对象上的allow()函数。它由控制器构造函数调用,以在ACL中设置规则。

  • deny() - 至于允许。

所以,在运行时,一系列事件如下:

  • 动作助手的引导加载。这a)实例化自定义ACL对象,该对象设置自己的角色,然后b)将当前控制器名称添加为资源。

  • 控制器init()运行。它调用助手的allow()deny()方法来设置规则。

  • 运行帮助程序preDispatch(),如果!isAllowed(),用户被重定向。

我对数据库进行了认证,但是如果您使用的是LDAP,则适用同样的逻辑。 (在这种情况下,Apache的基本认证提示是否是默认的挑战?如果不是,这可能会增加额外的复杂性)。

我改编自Rob Allen(Zend Framework in Action)的书以及其他各种资源。请注意,一些Zend专业人员推荐基于模型的ACL(而不是控制器操作)。我会把这个想法放在赛道上。

上述方法的一个特别方便的方面是,持续维护ACL规则非常简单。在您正在使用特定控制器时,您在init()中设置了其ACL规则。

+0

谢谢你这样详细的答案,但我不知道我需要ACL - 我有一个Intranet应用程序,我需要的是通过身份验证从LDAP获取用户信息。那么“基本的Apache auth” - 它在某些条件下的必要原因(Kerberos是下一个任务)呢? – Chvanikoff 2011-04-09 07:00:33

0
 
AuthType basic                       
AuthName "Secure Login"                   
AuthBasicProvider ldap                    
AuthLDAPURL "ldaps://ldap.example.com/ou=People,dc=exmaple,dc=com?uid?sub". 

将其添加到您的目录指令中,这将覆盖您对ldap验证的需求。但是你仍然需要知道如何重新引导新来的访客来索引,可能是cookies。