IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

使用SoapHeader实现Soap请求验证

风雪之隅 2010-03-28 15:14:43 累计浏览 6,057 次
本机暂存

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

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

假设客户端代码如下:

<?php/** 保存用户名和密码的载体*/class SoapUserInfo {    /**      * @var char $name      */    public $name;    /**      * @var char $password      */    public $password;     public function __construct($l, $p) {        $this->Password = $p;        $this->Username = $l;    }}

然后客户端生成SoapHeader

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

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

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

<?php    $client = new SoapClient($wsdl);    $client->__setSoapHeaders(array($soap_header));    $client->__soapCall('request', array());

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

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

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

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

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

<?phpclass InterfaceClass {     /**      * @var bool $authorized*/    private $authorized = FALSE;    /** Authentication function** @param string username* @param string password*/    public function Authentication($username, $password) {          $this->authorized = validateUser($username, $password);    }     /** Test method*/    public function request(){          if ($this->authorized) {               //验证成功, 继续处理.          } else {               //验证失败, 拒绝请求.          }    }}

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

<?phpclass InterfaceClass {     /**      * @var bool $authorized*/    private $authorized = FALSE;    function __construct() {         $xml = file_get_contents('php://input');         //分析xml, 获得SoapHeader数据, 验证    }}

Must Understand

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

SOAP_ACTOR_NEXT

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

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

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

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

这样, 我们就可以在Client的SoapHeader中, 通过设置actor是laruence, 来让指定的Server来获得我们设置的头部的信息.

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 使用gettext来支持PHP的多语言 (累计阅读 39,267)
  2. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,163)
  3. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,407)
  4. 我的PHP,Python和Ruby之路 (累计阅读 13,146)
  5. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,788)
  6. 15个最好的免费开源电子商务平台 (累计阅读 12,540)
  7. Redis消息队列的若干实现方式 (累计阅读 12,087)
  8. 到底什么是MVC? (累计阅读 11,865)
  9. 整理了一份招PHP高级工程师的面试题 (累计阅读 11,708)
  10. Rolling cURL: PHP并发最佳实践 (累计阅读 11,486)