Zend Framework 2参考Zend\Authentication(HTTP认证适配器)

介绍

Zend\Authentication\Adapter\Http提供了RFC-2617BasicDigest的主要标准的实现。摘要式身份验证HTTP身份验证的方法,提高了基本身份验证时提供的方式进行身份验证,而无需在网络上以明文传送口令。

主要特点:

  • 支持基本和摘要式身份验证。
  • 响应所有客户端支持的方案的问题的解决
  • 支持代理认证。
  • 包括支持文本文件认证和验证其他来源,如数据库提供了一个接口。

还有一些显著的 RFC-2617 特性没有实现:

  • 没有跟踪,可能需要对”stale”(过去)状态的跟踪,和对重复访问攻击的保护
  • 完整性检查认证或”auth-int”
  • HTTP头的认证信息

设计概述

这个适配器包括两个子组件,HTTP认证类本身和解析的”Resolvers”,HTTP验证类封装的进行基本和摘要式身份验证的逻辑。它使用Resolver在一些数据存储(缺省是文本文件)来查找客户的身份,从数据存储和检索凭据。 “resolved”的证书,然后比较客户端提交的决定认证是否成功的值。

配置选项

Zend\Authentication\Adapter\Http通过数组配置进行构造,一些选项是可选,另外一些是必须的:

配置选项

选项名 是否必须 描述
accept_schemes Yes 确定适配器将接受来自客户端的认证方案,必须包含‘basic’和(或) ‘digest’的一个用空格分割的列表.
realm Yes 设置认证区域;在给定的区域里用户名必须是唯一的。
digest_domains Yes, when accept_schemes contains digest 空间分隔的有效相同的认证信息的URIs列表。 URIs不需要都指向同一台服务器上。
nonce_timeout Yes, when accept_schemes contains digest 设置认证失效时间(单位:秒),参考下面注释
use_opaque No 指定是否发送头信息中的不透明的值。默认为true。
algorithm No 指定的算法。默认为MD5,唯一支持的选项(现在)。
proxy_auth No 默认情况下禁用。启用执行代理认证,而不是正常的源服务器认证。

注意:目前使用的nonce_timeout有一些有趣的副作用。此设置用来确定给定的nonce的有效期,或有效地接受客户端的身份验证信息多久。目前,如果它被设置为3600(举例来说),这将导致每隔一小时适配器提示客户端提供新的凭据。在未来的版本中,将通过跟踪和过时支持来解决。

解析

解析器的工作是接受用户名和区域,并返回某种证书值。基本认证期望接收用户的密码的Base64编码版本。高级认证期望接收用户的用户名,区域和密码(用冒号分隔)的哈希。目前,唯一支持的哈希算法是MD5。
Zend\Authentication\Adapter\Http依赖实现了Zend\Authentication\Adapter\Http\ResolverInterface的类。一个文本文件解析器类包含这样的适配器,但任何其他类型的解析器,可以简单地通过创建实现解析器接口。

文件解析器

文件解析器是一个非常简单的类。它有一个单个的属性指定一个文件名传递给构造方法。它的resolve()方法遍历文本文件,寻找符合匹配的用户名和区域的行。文本文件格式,类似于Apache的htpasswd文件:

1
<username>:<realm>:<credentials>\n

每行包含三个字段 – 用户名,领域和证书 – 由冒号分隔。凭据字段是不透明的文件解析器,它只是返回值给调用者。因此,同样的文件格式基本和摘要式身份验证。在基本身份验证,证书字段应该以明文形式写入。摘要式身份验证,它应该是上述的MD5。
有两个同样简单的方法来创建一个文件解析器:

1
2
3
use Zend\Authentication\Adapter\Http\FileResolver;
$path     'files/passwd.txt';
$resolver new FileResolver($path);

1
2
3
$path     'files/passwd.txt';
$resolver new FileResolver();
$resolver->setFile($path);

如果给定的路径是空的或不可读,将抛出一个异常

基本用法

首先,建立一个所需配置值的数组:

1
2
3
4
5
6
$config array(
    'accept_schemes' => 'basic digest',
    'realm'          => 'My Web Site',
    'digest_domains' => '/members_only /my_account',
    'nonce_timeout'  => 3600,
);

这个数组使得适配器接受基本或摘要式身份验证,并将请求对所有在/members_only/my_account区域的访问认证。区域值通常显示在浏览器中的密码对话框。当然nonce_timeout会有上面说到的效果。
然后创建Zend\Authentication\Adapter\Http对象:

1
$adapter new Zend\Authentication\Adapter\Http($config);

由于我们支持基本和摘要式身份验证,我们需要两个不同的解析器对象。请注意,这可能只是两个简单的不同的类:

1
2
3
4
5
6
7
8
9
10
use Zend\Authentication\Adapter\Http\FileResolver;
 
$basicResolver new FileResolver();
$basicResolver->setFile('files/basicPasswd.txt');
 
$digestResolver new FileResolver();
$digestResolver->setFile('files/digestPasswd.txt');
 
$adapter->setBasicResolver($basicResolver);
$adapter->setDigestResolver($digestResolver);

最后,我们执行身份验证。为了完成工作,适配器需要对请求和响应进行引用:

1
2
3
4
5
6
7
8
9
10
assert($request instanceof Zend\Http\Request);
assert($response instanceof Zend\Http\Response);
 
$adapter->setRequest($request);
$adapter->setResponse($response);
 
$result $adapter->authenticate();
if (!$result->isValid()) {
    // Bad username/password, or canceled password prompt
}

Zend Framework 2参考Zend\Authentication(HTTP认证适配器)的更多相关文章

  1. Zend Framework 2参考Zend\Authentication(数据库表认证)

    + 转载自:Zend Framework 2参考Zend\Authentication(数据库表认证) 介绍 Zend\Authentication\Adapter\DbTable提供对存储在数据库表 ...

  2. Zend Framework 2参考Zend\Authentication(摘要式身份验证)

    Zend Framework 2参考Zend\Authentication(摘要式身份验证) 介绍 摘要式身份验证是HTTP身份验证的方法,提高了基本身份验证时提供的方式进行身份验证,而无需在网络上以 ...

  3. Zend Framework 2参考Zend\Authentication(Zend\Authentication介绍)

    原文:Zend Framework 2参考Zend\Authentication(Zend\Authentication介绍) Zend\Authentication组件提供了认证接口和具体的通用的认 ...

  4. 关于Zend Framework 2中 Zend\Session的使用

    一直迷惑于zend\Session的使用,这个是Zend\Session的官方教程的中文版,http://zend-framework-2.yangfan.co/blog/556. 其中最重要的是关于 ...

  5. Zend Framework 1 - Quick Start

    创建 Zend 项目 要创建 Zend 项目,首先要下载并解压 Zend Framework. 安装 Zend Framework 下载最新的 Zend Framework 1.12.20 源码包,( ...

  6. Zend Framework XML外部实体和安全绕过漏洞

    漏洞版本: Zend Framework 1.x 漏洞描述: Bugtraq ID:66358 Zend Framework是一款开放源代码的PHP5开发框架实现. Zend Framework存在多 ...

  7. Zend Framework学习日记(2)--HelloWorld篇(转)

    Zend Framework学习日记(2)--HelloWorld篇 这一篇主要演示如何用zf命令行工具建立一个基于Zend Framework框架的工程,也是我初学Zend Framework的小练 ...

  8. Zend Framework 留言本实战(转)

    一.环境搭建和ZF安装              *[注]本节内容大部分来至Zend Framework官方手册       1.1 Zend Framework下载 Zend Framework 使 ...

  9. 主流PHP框架间的比较(Zend Framework,CakePHP,CodeIgniter,Symfony,ThinkPHP,FleaPHP)

    Zend Framework 优点: Zend Framework大量应用了PHP5中面向对象的新特征:接口.异常.抽象类.SPL等等.这些东西的应用让Zend Framework具有高度的模块化和灵 ...

随机推荐

  1. linux重新增加硬盘容量

    1.先用df -h查看硬盘使用情况 2.fdisk -l查看分区情况 表示还没有挂载 3.fdisk /dev/vdb进行分区 4.mkfs.ext3 /dev/vdb进行格式化 5.mount /d ...

  2. 【javascript 函数基础知识】

    函数实际上是对象,每个函数都是 Function 类型的实例,而且都会与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定. [概念标签] ...

  3. SortedList的用法

    1.SortedList定义 System.Collections.SortedList类表示键/值对的集合,这些键值对按键排序并可按照键和索引访问.SortedList 在内部维护两个数组以存储列表 ...

  4. linux的fork函数

       fork函数  头文件:#include<unistd.h> 函数原型:pid_t fork( void);(pid_t 是一个宏定义,其实质是int 被定义在#include< ...

  5. vi 编辑器的使用

    1)    vi的自动对齐功能   我从window的网页上拷贝了一段代码到vi中,结果是不对齐的.见下图 此时为了对齐,我的做法是: ESC-v  进入视图模式,然后全选 再然后直接按 = 号. 然 ...

  6. Java笔记1 : 在生产者消费者模式中,线程通信与共享数据,死锁问题与解决办法

    本例定义了4个类,这里说一下,方便下面讲解.分别是Product(产品),Producer(生产者),Consumer(消费者), Test(测试类). 多线程之间通信与共享数据只要引用同一内存区域就 ...

  7. [Jquery] js获取浏览器滚动条距离顶端的距离

    需要用js获取滚动条距离窗口顶端的距离和js获取浏览器可视化窗口的大小  一.jQuery获取的相关方法 jquery 获取滚动条高度 获取浏览器显示区域的高度 : $(window).height( ...

  8. Eclipse+Maven+Spring+CXF 构建webservice 服务

    一. 软件准备 Eclipse 4.2.1 Maven 2.2.1 Spring 3.2.6 CXF 3.0.2 二. 步骤 首先,在Eclipse中用maven构建一个quickstart版本的ma ...

  9. HTML5的Server-Sent Events功能的使用

    客户端代码示例 //创建一个新的 EventSource 对象,然后规定发送更新的页面的 URL. var source = new EventSource("http://localhos ...

  10. 《ruby编程语言》笔记 1

    赋值: ruby支持并行赋值,即允许在赋值表达式中出现多余一个值和多于一个的变量: x,y=1,2a,b=b,ax,y,z=[1,2,3] (python同样可以正常上面的语句). Methods i ...