微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过SoapHeader实现身份认证

之前一直抱怨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/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐