通过SoapHeader实现身份认证

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

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

理论就不多说了,我也不懂,直接上代码
client.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

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/

你可能感兴趣的:(通过SoapHeader实现身份认证)