Zend_Auth:允许用户登录到多个表/身份

2024-01-28

我在用Zend_Auth用于门户网站中的身份验证。

一个普通的 mySQL“用户”表,带有login and password列被查询,并且用户登录。

但是,我想要对另外两组用户进行身份验证。这三个用户组都有自己的其他表中的登录数据。他们的数据来自外部来源,因此不需要将这些登录帐户统一为一个。

因此,一个用户可能是来自三个组中任何一个组的经过身份验证的用户,甚至是所有三个组的用户,同时.

三个登录组中的每一组都有自己的登录表单和注销按钮。

目前,我有一个简单的、简单的Zend_Auth登录,取自一些教程并稍加修改,看起来大约像这样:

function login($user, $password)
{

$auth = Zend_Auth::getInstance();
$storage = new Zend_Auth_Storage_Session();

$auth->setStorage($storage);

$adapter = new Zend_Auth_Adapter_DbTable(....);

$adapter->setIdentity($username)->setCredential($password); 

$result = $auth->authenticate($adapter);

if ($result->isValid())
 ......... success!
else 
 .... fail!

我必须从哪里开始提供此服务并解决三个组的单独“登录”状态?我的想法是我想共享会话,并单独管理身份验证。

这可能吗?也许有一个简单的前缀可以让这变得容易?是否存在有关该问题的教程或资源?

我是 Zend 框架的新手。


您应该创建自己的 Zend_Auth_Adapter。该适配器将尝试对您的三个资源进行身份验证,并将其标记在私有成员变量中,以便您可以知道哪些登录尝试已成功通过身份验证。

要创建您的 Auth 适配器,您可以以 Zend_Auth_Adapter_DbTable 为基础。

因此,在 __construct 中,您可以传递每个资源中使用的三个适配器,而不是仅传递一个 DbTable 适配器。仅当每个适配器使用不同的资源(例如 LDAP,甚至另一个数据库)时,您才会采用这种方式,否则,您可以仅传递一个适配器并在配置选项中设置三个不同的表名称。

这是来自 Zend_Auth_Adapter_DbTable 的示例:

    /**
     * __construct() - Sets configuration options
     *
     * @param  Zend_Db_Adapter_Abstract $zendDb
     * @param  string                   $tableName
     * @param  string                   $identityColumn
     * @param  string                   $credentialColumn
     * @param  string                   $credentialTreatment
     * @return void
     */
    public function __construct(Zend_Db_Adapter_Abstract $zendDb, $tableName = null, $identityColumn = null,
                                $credentialColumn = null, $credentialTreatment = null)
    {
        $this->_zendDb = $zendDb;

        // Here you can set three table names instead of one
        if (null !== $tableName) {
            $this->setTableName($tableName);
        }

        if (null !== $identityColumn) {
            $this->setIdentityColumn($identityColumn);
        }

        if (null !== $credentialColumn) {
            $this->setCredentialColumn($credentialColumn);
        }

        if (null !== $credentialTreatment) {
            $this->setCredentialTreatment($credentialTreatment);
        }
    }

下面的方法来自 Zend_Auth_Adapter_DbTable,尝试对一个表进行身份验证,您可以将其更改为在三个表中尝试,并且对于每个表,当您成功时,可以将其设置为私有成员变量中的标志。类似于 $result['group1'] = 1;您将为每次成功登录尝试设置 1。

/**
 * authenticate() - defined by Zend_Auth_Adapter_Interface.  This method is called to
 * attempt an authentication.  Previous to this call, this adapter would have already
 * been configured with all necessary information to successfully connect to a database
 * table and attempt to find a record matching the provided identity.
 *
 * @throws Zend_Auth_Adapter_Exception if answering the authentication query is impossible
 * @return Zend_Auth_Result
 */
public function authenticate()
{
    $this->_authenticateSetup();
    $dbSelect = $this->_authenticateCreateSelect();
    $resultIdentities = $this->_authenticateQuerySelect($dbSelect);

    if ( ($authResult = $this->_authenticateValidateResultset($resultIdentities)) instanceof Zend_Auth_Result) {
        return $authResult;
    }

    $authResult = $this->_authenticateValidateResult(array_shift($resultIdentities));
    return $authResult;
}

仅当三个登录尝试之一成功通过身份验证时,您才会返回有效的 $authresult。

现在,在您的控制器中,尝试登录后:

public function loginAction()
{
    $form = new Admin_Form_Login();

    if($this->getRequest()->isPost())
    {
        $formData = $this->_request->getPost();

        if($form->isValid($formData))
        {

            $authAdapter = $this->getAuthAdapter();
                $authAdapter->setIdentity($form->getValue('user'))
                            ->setCredential($form->getValue('password'));
                $result = $authAdapter->authenticate();

                if($result->isValid()) 
                {
                    $identity = $authAdapter->getResult();
                    Zend_Auth::getInstance()->getStorage()->write($identity);

                    // redirect here
                }           
        }

    }

    $this->view->form = $form;

}

private function getAuthAdapter() 
{   
    $authAdapter = new MyAuthAdapter(Zend_Db_Table::getDefaultAdapter());
    // Here the three tables
    $authAdapter->setTableName(array('users','users2','users3'))
                ->setIdentityColumn('user')
                ->setCredentialColumn('password')
                ->setCredentialTreatment('MD5(?)');
    return $authAdapter;    
} 

这里的关键是下面的行,它将在您的自定义身份验证适配器中实现:

$identity = $authAdapter->getResult();

您可以以此形式为基础 Zend_Auth_Adapter_DbTable:

   /**
     * getResultRowObject() - Returns the result row as a stdClass object
     *
     * @param  string|array $returnColumns
     * @param  string|array $omitColumns
     * @return stdClass|boolean
     */
    public function getResultRowObject($returnColumns = null, $omitColumns = null)
    {
        // ...
    }

成功通过身份验证后,这将返回登录尝试中匹配的行。 因此,您将创建可以返回该行以及 $this->result['groupX'] 标志的 getResult() 方法。 就像是:

public function authenticate() 
{
    // Perform the query for table 1 here and if ok:
    $this->result = $row->toArrray(); // Here you can get the table result of just one table or even merge all in one array if necessary
    $this->result['group1'] = 1;

    // and so on...
    $this->result['group2'] = 1;

    // ...
    $this->result['group3'] = 1;

   // Else you will set all to 0 and return a fail result
}

public function getResult()
{
    return $this->result;
}

毕竟您可以使用 Zend_Acl 来控制您的视图和其他操作。由于您将在 Zend Auth 存储中拥有这些标志,因此您可以将其用作角色:

$this->addRole(new Zend_Acl_Role($row['group1']));

这是一些资源:

http://framework.zend.com/manual/en/zend.auth.introduction.html http://framework.zend.com/manual/en/zend.auth.introduction.html

http://zendguru.wordpress.com/2008/11/06/zend-framework-auth-with-examples/ http://zendguru.wordpress.com/2008/11/06/zend-framework-auth-with-examples/

http://alex-tech-adventures.com/development/zend-framework/61-zendauth-and-zendform.html http://alex-tech-adventures.com/development/zend-framework/61-zendauth-and-zendform.html

http://alex-tech-adventures.com/development/zend-framework/62-allocation-resources-and-permissions-with-zendacl.html http://alex-tech-adventures.com/development/zend-framework/62-allocation-resources-and-permissions-with-zendacl.html

http://alex-tech-adventures.com/development/zend-framework/68-zendregistry-and-authentication-improvement.html http://alex-tech-adventures.com/development/zend-framework/68-zendregistry-and-authentication-improvement.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Zend_Auth:允许用户登录到多个表/身份 的相关文章

  • 为什么我们要关闭 Mysqli 中的结果

    为什么我们要关闭 result mysqli new mysqli localhost root root test if mysqli gt connect errno echo Failed to connect to MySQL my
  • 如何使用PHP在服务器端缩小图像?

    我有一些从服务器提取的图像 imgUrl保存图像的路径 现在我用 img src width 100 height 200 或 CSS 来缩小图像 但我想在 PHP 中执行此操作 以便将已缩放的图像提供给 DOM 有任何想法吗 Thanks
  • 如何获取与 PHP 中的日期数组相比最接近的日期

    这个帖子 https stackoverflow com questions 11012891 how to get most recent date from an array of dates几乎为我回答了这个问题 但我有一个特定的需求
  • 根据产品变体术语将收件人添加到 Woocommerce 电子邮件通知

    我创建了一个 Woocommerce 插件并要求它做两件事 根据购物车中的产品变体 向特定电子邮件地址发送通知消息 电子邮件必须仅包含相关产品 不得包含其他属性的产品 例如 产品 A 具有名为 Chef 的属性 其中 Chef one 和
  • Zend 1.11 和 Doctrine 2 自动从现有数据库生成所需的一切

    我是 ORM 新手 我真的很想学习它 我按照本教程成功地使用 Zend 1 11 x 安装了 Doctrine 2 1 的所有类和配置 http www zendcasts com unit testing doctrine 2 entit
  • localhost/test.php 不返回任何内容

    我正在遵循教程构建一个网络应用程序 我创建了一个简单的test php网络空间中的文件 var www html 问题是当我输入localhost test php在浏览器地址窗口中 它返回一个空页面 我试过localhost php in
  • 将 php filter_var 与 mysql_real_escape_string 结合使用

    我想首先说 我意识到 PDO mysqli 是新标准 并且已被 SO 广泛覆盖 然而 在这种特殊情况下 我没有时间在启动客户端站点之前将所有查询转换为 PDO 以下内容已在网站上的大多数查询中使用 我可以补充一下 这不是我所使用的 user
  • Graph API / FQL 不返回页面的所有事件

    脸书页面 http facebook com getwellgabby events http facebook com getwellgabby events 目前有 8 个活动 我能看到他们 非管理员可以看到它们并可以加入它们 但是 当
  • 如何在 php 中访问名为变量的对象属性?

    以 JSON 编码的 Google API 返回一个如下所示的对象 updated gt stdClass Object t gt 2010 08 18T19 17 42 026Z 任何人都知道我如何访问 t value object gt
  • 如何简单地检查服务器PHP版本是否为5或以上?

    我正在为程序创建预安装清单 该程序需要 PHP5 因此我需要检查列表脚本来检查 PHP5 的可用性 有一个函数为phpversion 将以以下格式返回5 3 6或类似的 然而 我希望清单非常简单 只是告诉你是或否 所以显示当前版本对我没有多
  • 将 Php 数组编码为 json [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想对我的 php 数组进行编码 A
  • WooCommerce:检查商品是否已在购物车中

    我从中发现了这个很棒的片段website https joebuckle me quickie woocommerce check if item already in cart 以下是检查购物车中是否存在特定产品的函数 function
  • CodeIgniter 控制器构造函数

    我对 codeigniter 很陌生 我想知道控制器中构造函数的含义是什么 我在 codeigniter 教程中看到以下代码 class upload extends CI Controller function construct par
  • https 重定向 laravel .htaccess 之后删除 /public

    我有一个 Laravel 页面部署在共享主机中 当我强制 http 请求重定向到 https 时 url 包含 public 我的根 htaccess 是 RewriteEngine on RewriteCond REQUEST URI p
  • 如何从 URL 获取当前的 Web 目录?

    如果我有一个网址http www example com sites dir index html http www example com sites dir index html 我想提取 sites 这个词 我知道我必须使用正则表达式
  • 为什么 count 比 $count 差

    我只是在查看不同问题的答案以了解更多信息 我看到一个answer https stackoverflow com a 4891402 429850这表明在 php 中编写这样的做法是不好的做法 for i 0 i
  • 如何访问带有美元符号的 PHP 对象属性?

    我有一个 PHP 对象 其属性中有一个美元 符号 如何访问该属性的内容 例子 echo object gt variable Ok echo object gt variable WithDollar Syntax error With 变
  • PHP7.1上读取会话数据失败

    分享一个我遇到的问题 现已解决 在我的开发机器上 我使用 PHP 运行 IIS 我升级到 PHP7 突然我的代码不再工作 返回此错误 session start 读取会话数据失败 用户 路径 C WINDOWS temp 看起来像是权限问题
  • 使用 Laravel Socialite 登录 facebook

    然而 我是 Laravel 的新手 我正在遵循以下教程http www codeanchor net blog complete laravel socialite tutorial http www codeanchor net blog
  • CodeIgniter加入选择为

    我的数据库中有 2 个表需要加入 一张表是 artikelen 表 另一张表是 Collections 表 我目前有 this gt db gt select this gt db gt from collecties this gt db

随机推荐

  • MagicalRecord:多个数据库

    我有一个使用 MagicalRecord 的应用程序 并且我正在使用大量用于参考的数据预先填充数据库 在同一数据模型中 我拥有与用户在应用程序中可能执行的操作相关的用户可定义信息 该应用程序被拒绝 因为预填充的数据应该被标记为 不备份 因此
  • 异常情况下自动回滚有什么缺点?

    当您编写 Flask sqlalchemy 应用程序并进行数据库查询 异常处理时 如下所示 def add user user User gt bool was the user added errors try db session ad
  • 塑料单片机。这是正确的解决方案吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我知道已经有一些关于塑料 SCM 的问题 但它们已经存在一年多了 最近有人用过Plastic SCM吗 你怎么看待这件事 我已经使用过 git
  • pandas:如何绘制 pandas 中 IMDB 电影的电影数量与类型的饼图?

    我有以下数据集 import pandas as pd import numpy as np matplotlib inline df pd DataFrame movie A B C D genres Science Fiction Ro
  • 存在同名数据库,或无法打开指定文件,或位于 UNC 共享上

    当我在新电脑上运行我的项目时出现此错误 为了避免这种情况 我每次都必须复制粘贴新的连接字符串 有什么办法可以避免这种情况 我有3个不同的数据库 它非常烦人的O O SqlConnection con new SqlConnection Da
  • 复合键作为外键(sql)

    这是我关心的两个表 CREATE TABLE IF NOT EXISTS tutorial beggingTime time NOT NULL day varchar 8 NOT NULL tutorId int 3 NOT NULL ma
  • gulp:gulp任务回调函数在哪里定义的?

    gulp 中的任务可以这样定义 gulp task foobar function callback 我想了解回调函数是什么 它在哪里定义的 我可以在运行时传入其他函数作为参数吗 它有什么作用 这些文档 https github com g
  • 如何在 WPF 弹出窗口中放置关闭 [x]

    我已经在 c 和 wpf 中使用此代码成功创建了一个弹出窗口
  • 为什么我的 Twitter Bootstrap 表单字段使用流体容器会溢出?

    更新 问题演示在这里 http jsfiddle net fdB5Q embedded result http jsfiddle net fdB5Q embedded result 从大约 767 像素到 998 像素 表单字段比包含井更宽
  • 如何隐藏 TieredCompilation 警告?

    我正在使用 Linux Mint 和 OpenJDK java version显示这个 java version 1 7 0 79 OpenJDK Runtime Environment IcedTea 2 5 6 7u79 2 5 6 0
  • 为什么 bash 按字典顺序而不是数字来评估数字比较?

    有人可以解释一下 if 重击块 我使用下面的简单代码检查是否第一个值小于第二个值 first value 67 second value 2 if first value lt second value then echo Yes else
  • WiX .NET Bootstrapper - 功能选择

    我们正在尝试获取自定义 NET Bootstrapper 以便通过我们的 WiX 安装程序有选择地安装 MSI 包中的功能 注册了 PlanMsiFeature 事件后 我们认为我们将能够访问 MSI 中的功能并根据预设条件排除某些功能 然
  • d3.js 受形状约束的力定向布局

    我想知道是否有一种方法可以使用 d3 js 创建强制导向布局并通过任意形状限制它 这样 所有节点均等分布within形状和 边界和节点之间的距离等于节点之间的距离 我希望已经有这样的解决方案 否则 我的想法是从力导向布局开始 并在每次迭代中
  • 在 Sequelize 中按日期范围查询列字段

    我正在尝试使用 Sequelize 查询数据库以获取在特定日期范围内创建的项目 我用的是 between运营商 但我似乎没有得到任何东西 where createdAt between 2018 03 31T21 00 00 000Z 20
  • Gitcherry-pick 会发生合并冲突

    目前我有两个分支 master beta 001 beta 001 之前有时会从 master 处检出 为了使 beta 001 更新到 master 在 master 中推送的提交也将被挑选到 beta 001 一切都运行良好 直到 be
  • 从一个视图切换到下一个视图

    我有一个带有两个视图和视图控制器的应用程序 如何让用户从一个视图切换到下一个视图 例如在主屏幕或天气应用程序中 我知道界面生成器中有一个页面控件 但它只是用户所在页面的指示器 感谢并抱歉我的英语不好 查看 Apple 的 iPhone 示例
  • wxPython 中带有自动关闭计时器的 wxMessageBox

    平台 Windows OS X Python版本 活动状态Python 2 7 wxPython版本 2 9版 如果您通过子类化创建自己的自定义对话框wx Dialog http www wxpython org docs api wx D
  • 在 React js 中将数组作为 props 传递

    我是新来的反应 我一直在尝试 React 但我陷入了如何使用 props 传递数组的困境 case 1 var c program var Navigation React createClass getInitialState funct
  • AES 加密 Java 密钥长度无效

    我正在尝试创建 AES 加密方法 但由于某种原因我不断收到 java security InvalidKeyException Key length not 128 192 256 bits 这是代码 public static Secre
  • Zend_Auth:允许用户登录到多个表/身份

    我在用Zend Auth用于门户网站中的身份验证 一个普通的 mySQL 用户 表 带有login and password列被查询 并且用户登录 但是 我想要对另外两组用户进行身份验证 这三个用户组都有自己的其他表中的登录数据 他们的数据