提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2010-11-16 17:29:45.000|阅读 749 次
概述:本文主要介绍如何使用 Zend_Auth 和 Zend_Db 实现用户认证(ZF Study),希望对大家有帮助。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
来记录一下如何使用 Zend Framework(ZF)来实现用户的认证操作:
首先先来看看 ZF 手册对 Zend_Auth 组件的简介:
Zend_Auth 为认证(authentication)和一些通用用例情景的具体认证适配器提供了一个API。
Zend_Auth 只涉及 认证而不是授权。认证被宽松地定义为基于一些证书(credential)来确定一个实体(例如,身份)是否确实是它所声称的。授权是一个过程,它决定是否允许一个实体对其他实体进行访问、执行操作,它超出了Zend_Auth的范围。更多关于Zend Framework 授权和访问控制的信息,参见 Zend_Acl.
Note: Zend_Auth 类通过它的 getInstance()方法实现 Singleton 模式 - 只有一个实例可用。这意味着使用 new 操作符和 clone 关键字将不能在Zend_Auth 类中工作,而要使用 Zend_Auth::getInstance() 来代替。
1,数据库表信息
在我们的 MySQL 里新建一个 phpweb20 数据库及 users 表,作为测试,建表的 SQL 语句如下所示:
CREATE TABLE `users` (
`user_id` bigint(20) unsigned NOT NULL auto_increment,
`username` varchar(255) NOT NULL,
`password` varchar(32) NOT NULL,
`user_type` varchar(20) NOT NULL,
`ts_created` datetime NOT NULL,
`ts_last_login` datetime default NULL,
PRIMARY KEY (`user_id`),
UNIQUE KEY `user_id` (`user_id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=gbk
主键为 user_id 字段。
2,Zend_Auth 如何工作
首先我们要理解 Zend_Auth 所使用的术语,标识一个用户的唯一信息称为其“身份”,用户成功地认证以后,将其身份存储在一个 PHP 会话之中,从而在以后的页面中能够标识这些用户。(关于这里的 PHP 会话,Zend_Auth 为此提供了一个 Zend_Auth_Storage_Session 类,而这个类又进一步使用了 Zend_Session 组件,这实际上是 PHP 的 $_SESSION 变量的一个包装器,而且提供了更强大的功能)
要认证一个用户,用户必须提供一个凭证,在我们的例子当中,使用 users 表中的 password 作为用户的凭证,我们将使用一个适配器根据数据库来检查给定的用户的身份和凭证。这个适配器是 Zend_Auth_Adapter_DbTable 适配器,这个适配器设计为使用 Zend_Db 组件,如果要是想编写自己的适配器,只需实现一个方法:authenticate() 方法,该方法要返回一个 Zend_Auth_Result 对象。这个对象包含着认证是否成功的有关信息,还包含一些诊断信息。
3,实例化 Zend_Auth
Zend_Auth 是一个单例类,使用静态的 getInstance() 方法来获取这个实例,然后必须使用 setStorage() 方法设置存储类(要注意,我们使用的是 PHP 的会话):
以下代码用于建立 Zend_Auth 实例:
$auth = Zend_Auth::getInstance();
$auth -> setStorage(new Zend_Auth_Storage_Session());
4,如何完成认证
来说一些具体的关于 Zend_Auth_Adapter_DbTable 的东西:
我们将使用 Zend_Auth_Adapter_DbTable 认证适配器,使用这个适配器之前,必须已经有一个合法的 Zend_Db 对象。它的实例化需要 5 个参数:
> 合法的 Zend_Db 对象($db);
> 所用数据库表的名(这里使用的是 users);
> 保存用户身份的列(username 字段);
> 保存用户凭证的列(password 字段);
> 最后一点,对凭证的处理。这实际上是包装凭证的一个函数,假如存储用户信息的时候,password 字段存放的是用户密码的 MD5 散列值,那么我们就要把 md5(?) 作为最后一个参数传入。此问号只是 Zend_Db 在哪里带入口令值。
一旦实例化了 Zend_Auth_Adapter_DbTable ,就可以设置身份(username)和凭证(password)了,为此要使用 setIdentity() 和 setCredential() 方法。接下来,在 $auth 对象(Zend_Auth 的实例)上调用 authenticate() 方法,而传入 anthenticate() 方法的唯一参数是适配器($adapter),通过它来返回一个 Zend_Auth_Result 的一个实例。还可以通过调用 Zend_Auth_Result 对象的 isValid() 方法来查看用户是否通过了认证,还可以调用其他的方法来查看错误信息。
实现代码如下:
<?php
/**
* 使用 Zend_Auth 和 Zend_Db 实现用户认证
*/
//启用 ZF 的自动调用机制(必备的一步)
require_once('Zend/Loader/Autoloader.php');
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
//数据库配置数组
$params = array('host' => 'localhost',
'username' => 'root',
'password' => 'password',
'dbname' => 'phpweb20'
);
$db = Zend_Db::factory('pdo_mysql', $params);
//初始化 Zend_Auth 组件
$auth = Zend_Auth::getInstance();
$auth -> setStorage(new Zend_Auth_Storage_Session());
//初始化认证适配器
$adapter = new Zend_Auth_Adapter_DbTable($db, 'users', '
username', 'password', 'md5(?)');
//设置身份
$adapter -> setIdentity('fakeUsername');
//设置密码
$adapter -> setCredential('fakePassword');
//验证
$result = $auth -> authenticate($adapter);//返回 Zend_Auth_Result 实例
if($result -> isValid())
{
//登录成功
echo "Succeed!";
}
else
{
//登录失败
switch($result -> getCode())
{
case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
echo 'Identity not found!';
break;
case Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS:
echo 'Multiple users found with this identity!';
break;
case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
echo 'Invalid password!';
break;
default:
var_dump($result -> getMessages());
}
}
?>
其实还可以使用 $auth 对象来检查一个用户是否通过认证。hasIdentity() 方法指示一个用户是否通过认证,为了确定用户的具体身份,可以使用 getIdentity() 方法。类似地,可以使用 clearIdentity() 方法来注销用户,如果使用 PHP 会话作为存储方法,实际上,这会从会话中删除指定用户的身份。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:软件开发网面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢