zoukankan      html  css  js  c++  java
  • Zend Framework 2参考ZendAuthentication(HTTP认证适配器)

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

    介绍

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

    主要特点:

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

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

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

    设计概述

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

    配置选项

    ZendAuthenticationAdapterHttp通过数组配置进行构造,一些选项是可选,另外一些是必须的:

    配置选项

    选项名是否必须描述
    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。
    ZendAuthenticationAdapterHttp依赖实现了ZendAuthenticationAdapterHttpResolverInterface的类。一个文本文件解析器类包含这样的适配器,但任何其他类型的解析器,可以简单地通过创建实现解析器接口。

    文件解析器

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

    1
    <username>:<realm>:<credentials>

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

    1
    2
    3
    use ZendAuthenticationAdapterHttpFileResolver;
    $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会有上面说到的效果。
    然后创建ZendAuthenticationAdapterHttp对象:

    1
    $adapter new ZendAuthenticationAdapterHttp($config);

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    use ZendAuthenticationAdapterHttpFileResolver;
     
    $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 ZendHttpRequest);
    assert($response instanceof ZendHttpResponse);
     
    $adapter->setRequest($request);
    $adapter->setResponse($response);
     
    $result $adapter->authenticate();
    if (!$result->isValid()) {
        // Bad username/password, or canceled password prompt
    }
  • 相关阅读:
    js获取前一页面连接的参数值
    window.onload()函数和jQuery中的document.ready()有什么区别
    jquery中$.get()提交和$.post()提交有区别吗?
    JQuery有几种选择器?
    jQuery 库中的 $() 是什么?
    JavaScript内置可用类型
    .JS 中 == 和 === 区别是什么
    undefined,null 和 undeclared 有什么区别
    JS中如何将页面重定向到另一个页面
    数据库设计中,一对多如何处理?
  • 原文地址:https://www.cnblogs.com/heui/p/3430303.html
Copyright © 2011-2022 走看看