[转]使用SoapHeader实现Soap请求验证

PHPSoap Extension, 对于SoapServer来说, 并没有方法可用得到/处理客户端发送的SoapHeader信息.
网上也有很多人认为, 只能通过读取POST过来的请求XML文件, 分析, 才能得到客户端发送过来的SoapHeader.

, 其实在SoapServer, 其实是有一种办法, 可用把SoapHeader当作一个请求来处理, 从而获取到客户端提交的SoapHeader信息.

假设客户端代码如下:

 
1.                                   <?php
 
2.                                   /*
 
3.                                    * 保存用户名和密码的载体
 
4.                                    */
 
5.                                   class SoapUserInfo {
 
6.                                       /**
 
7.                                         * @var char $name
 
8.                                         */
 
9.                                       public $name;
 
10.                                   /**
 
11.                                     * @var char $password
 
12.                                     */
 
13.                                   public $password;
 
14.                                
 
15.                                   public function __construct($l, $p) {
 
16.                                       $this->Password = $p;
 
17.                                       $this->Username = $l;
 
18.                                   }
 
19.                               }
 
20.                               ?>
 
 

然后客户端生成SoapHeader

 
1.                                   <?php
 
2.                                       $soap_header = new SoapHeader("http://www.laruence.com", 'Authorise'
 
3.                                                  , new SoapUserInfo('laruence', 'password'), false, SOAP_ACTOR_NEXT);
 
4.                                   ?>
 
 

也许细心的同学会注意到4个参数FALSE5个参数SOAP_ACTOR_NEXT, 这是什么呢? 我最后再讲.

然后, 创建客户端, 绑定SoapHeader

 
1.                                   <?php
 
2.                                       $client = new SoapClient($wsdl);
 
3.                                       $client->__setSoapHeaders(array($soap_header));
 
4.                                       $client->__soapCall('request', array());
 
5.                                   ?>
 
 

现在, 客户端已经发起了请求, 请求中也包含了SoapHeader, 其中有了我们验证需要的用户名/密码信息.

那么, 在服务端, 该如何做呢?

 
1.                                   <?php
 
2.                                   $server = new SoapServer('laruence.wsdl');
 
3.                                   $server->setClass('InterfaceClass');
 
4.                                   $server->handle();
 
5.                                   ?>
 
 

关键的地方就在, 服务端接收请求以后, 会实例化一个处理类, 然后分析SoapHeader, 接着就会调用InterfaceClass::Authorise这个方法(Authorise是我们请求头中的变量名), 所以, 我们就可用在InterfaceClass类中, 定义个Authorise方法, 并在这个方法中对SoapHeader中的信息做验证.

然后, 请求体(Soap body)中的方法被调用, 因为不论Authorise方法返回什么(除非exit), 请求体中的方法一定会被调用, 所以要寻找个变量记录验证的结果.

 
1.                                   <?php
 
2.                                   class InterfaceClass {
 
3.                                        /**
 
4.                                         * @var bool $authorized
 
5.                                        */
 
6.                                       private $authorized = FALSE;
 
7.                                       /*
 
8.                                        * Authentication function
 
9.                                        *
 
10.                                    * @param string username
 
11.                                    * @param string password
 
12.                                    */
 
13.                                   public function Authentication($username, $password) {
 
14.                                         $this->authorized = validateUser($username, $password);
 
15.                                   }
 
16.                                
 
17.                                   /*
 
18.                                    * Test method
 
19.                                    */
 
20.                                   public function request(){
 
21.                                         if ($this->authorized) {
 
22.                                              //验证成功, 继续处理.
 
23.                                         } else {
 
24.                                              //验证失败, 拒绝请求.
 
25.                                         }
 
26.                                   }
 
27.                               }
 
28.                               ?>
 
 

当然, 对于网上说的另外一种方法, 通过分析请求的XML文件, 也可以:

 
1.                                   <?php
 
2.                                   class InterfaceClass {
 
3.                                        /**
 
4.                                         * @var bool $authorized
 
5.                                        */
 
6.                                       private $authorized = FALSE;
 
7.                                       function __construct() {
 
8.                                            $xml = file_get_contents('php://input');
 
9.                                            //分析xml, 获得SoapHeader数据, 验证
 
10.                                   }
 
11.                               }
 
12.                               ?>
 
 

Must Understand

这个参数指明了, 是否服务端必须要了解SoapHeader, 如果这个参数为真, 而服务端并不能识别响应的Header, 则会引发一个Soap Fault(Header not understood).

SOAP_ACTOR_NEXT

actor指明了SoapHeader要传递给谁, 被谁处理.

SOAP_ACTOR_NEXT的意思就是, 下一个接受到这个请求头的Service, 在本文的例子中只有一个Server,当然也就没有关系了.

SoapServer的构造函数中, 我们可以指明一个ServerActor, 比如:

 
1.                                   <?php
 
2.                                   $server = new SoapServer($wsdl, array('actor' => 'laruence'));
 
3.                                   ?>
 
 

这样, 我们就可以在ClientSoapHeader, 通过设置actorlaruence, 来让指定的Server来获得我们设置的头部的信息.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值