使用SoapHeader实现Soap请求验证
在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), 请求体中的方法一定会被调用, 所以要寻找个变量记录验证的结果.
- <?php
- class 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文件, 也可以:
- <?php
- class 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来获得我们设置的头部的信息.
建议继续学习:
- Ajax和WEB服务数据格式:XML SOAP HTML (阅读:3039)
- Apache设置帐户验证[.htaccess] (阅读:2979)
- 入门级的讲讲soap这个php webservice (阅读:2473)
- SOAP的S是Simple (阅读:2083)
- javascript各种各样的验证方法(正则表达式) (阅读:1692)
- javascript 验证例子,让你精通js (阅读:1676)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:雪候鸟 来源: 风雪之隅
- 标签: Soap SoapHeader 验证
- 发布时间:2010-03-28 15:14:43
- [56] Oracle MTS模式下 进程地址与会话信
- [56] IOS安全–浅谈关于IOS加固的几种方法
- [55] 如何拿下简短的域名
- [54] android 开发入门
- [54] 图书馆的世界纪录
- [53] Go Reflect 性能
- [50] 【社会化设计】自我(self)部分――欢迎区
- [50] 读书笔记-壹百度:百度十年千倍的29条法则
- [39] 程序员技术练级攻略
- [33] 视觉调整-设计师 vs. 逻辑