现在的位置: 首页 > 综合 > 正文

通过SoapHeader实现身份认证

2013年10月04日 ⁄ 综合 ⁄ 共 1520字 ⁄ 字号 评论关闭

之前一直抱怨phpsoap很傻,在client端有设置header的方法,在server端却没有取header的方法。那是很傻很天真,直接用正则表达式从soap信封的header中提取header信息。
最近由于有项目要发布webservice,重新燃起对soap的兴趣,看了w3的英文文档,那是个云里雾里。收集了一些资料,做了一个关于saop header进行身份认证的实验。

在这个实验中,假定soap client用一个字符串作为身份认证的标识,soap server取到这个字符串后,对其进行辨认,如果与期望相符合,认证通过,如果不符,抛出soapFault

理论就不多说了,我也不懂,直接上代码
client.php
<?php
$cli = new
SoapClient(null, array('uri' => 'http://127.0.0.1/namespace/', 'location'
=> 'http://localhost/server.php', 'trace' => true));

$h = new SoapHeader('http://127.0.0.1/namespace/',
'auth', '123456789', false, SOAP_ACTOR_NEXT);

$cli->__setSoapHeaders(array($h));
try {
    echo
$cli->say();

} catch (Exception $e) {
    echo
$e->getMessage();

}

server.php
<?php
class Server{
    
    public
function auth($a)

    {
   
    if($a != '123456789'){

   
        throw new SoapFault('Server', '
您无权访问');
   
    }

    }
    
   
function say()

    {
   
    return 'Hi';

    }
}

$srv = new
SoapServer(null, array('uri' => 'http://localhost/namespace'));

$srv->setClass('Server');
$srv->handle();

以上代码就实现了认证的功能,最关键的地方就是SoapHeader的构造。soapHeader有五个构造参数,

namespace

无用

name

鉴别身份标识的函数或者方法名

data

存放标识身份的字符串

mustUnderstand

是否必须处理该header

actor

处理该header的角色(不是太理解)

注意看红色的一行,构造了一个soapHeaderheader的名称为“auth”data“123456789”mustUnderstandfalseactorSOAP_ACTOR_NEXT
注意观察server.php中的server类有一个方法“auth”,刚好与header的名称对应,方法auth的参数$u,就是soapHeaderdatasoapServer接收到这个请求会,先调用auth方法,并把“123456789”作为参数传递给该方法。
mustUnderstand参数为false时,即便没有auth这个方法,say方法也会被调用,但是如果它为true的话,如果auth方法不存在,就会返回一个Soapfault告知该header没有被处理。

actor参数指名那些role必须处理该header,这儿我理解得不是太透彻,不好说。

大概就这样,关键点在于SoapHeader的构造。

soap官方:http://www.w3.org/TR/soap12-part1/

抱歉!评论已关闭.