使用SoapHeader实现Soap请求验证

2023-11-02

http://www.laruence.com/2010/03/26/1365.html

PHP的Soap 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个参数FALSE第5个参数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的构造函数中, 我们可以指明一个Server的Actor, 比如:


  
  
  1. <?php
  2. $server = new SoapServer($wsdl, array('actor' => 'laruence'));
  3. ?>
这样, 我们就可以在Client的SoapHeader中, 通过设置actor是laruence, 来让指定的Server来获得我们设置的头部的信息.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用SoapHeader实现Soap请求验证 的相关文章

  • 纠正装饰器模式的一个大缺点

    不久前 我在重构一些游戏战斗代码时决定尝试装饰器模式 战斗者可以拥有各种被动能力 也可能是不同类型的生物 我认为装饰器可以让我在运行时以各种组合添加行为 因此我不需要数百个子类 我几乎已经完成了 15 个左右的被动能力装饰器 在测试中我发现
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • 搜索引擎如何找到相关内容? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Google 在解析网络时如何找到相关内容 例如 Google 使用 PHP 原生 DOM 库来解析内
  • Laravel 从 5.6 升级到 Laravel 6

    我有一个项目https github com javedbaloch4 Laravel Booking https github com javedbaloch4 Laravel Booking发展于Laravel 5 6现在我想将其升级到
  • 如何使用 phpunit 运行单个测试方法?

    我正在努力运行一个名为testSaveAndDrop在文件中escalation EscalationGroupTest php with phpunit 我尝试了以下组合 phpunit EscalationGroupTest escal
  • 如何解压 PHP/Lumen/Laravel 的 gzip 请求?

    我收到来自第三方的 gzip 编码文本请求 1mb 所以这是有道理的 我的测试路线 router gt post testgzip function Illuminate Http Request request decompressed
  • 生成大随机数 php [重复]

    这个问题在这里已经有答案了 我想使用 PHP 生成一个包含 75 个字符的数字 我到处寻找 但一无所获 除了这个 http dailycoding com tools RandomNumber aspx http dailycoding c
  • 如何在原则 2 迁移中删除外键

    我想在原则 2 迁移中删除外键 但没有 dropForeignKeyConstraint 有谁知道怎么丢掉吗 public function down Schema schema table schema gt getTable table
  • 从 .phar 存档中提取文件

    对于 Phar 文件 我完全错过了一些东西 我正在安装一个需要 phpunit pdepend 和其他依赖项的项目 我将它们作为 phar 文件获取 但是 我无法使用命令行工具 php 命令 从中提取文件 我用谷歌搜索了这个问题 但没有发现
  • “使用未定义常量”注意,但该常量应该被定义

    共有三个文件 common php controller php 和 user php 文件 common php 如下所示 文件controller php看起来像 文件 user php 如下所示 执行脚本时 会给出通知 注意 使用未定
  • 交换关联数组中的两个项目

    Example arr array apple gt sweet grapefruit gt bitter pear gt tasty banana gt yellow 我想调换一下柚子和梨的位置 这样数组就变成了 arr array ap
  • PHP 脚本可以在终端中运行,但不能在浏览器中运行

    我正在尝试执行exec命令 但我遇到了问题 当我运行以下代码时 当我通过浏览器运行它时它不起作用 但如果我把输出 str将其复制并粘贴到终端中 它工作得很好 造成这种情况的原因是什么 我该如何解决 目前我正在运行localhost php
  • 在 PHP 中使用 phpseclib 时出现 RSA 问题

    我正在尝试在 phpseclib 中使用 RSA 实现 我认为在函数中执行一次代码并重新使用该函数会更容易 当我尝试向代码发送短信时 我收到一条错误消息 提示 解密错误 测试还让我意识到每次代码运行时密文都是不同的 所以我显然在那里做错了什
  • PHP preg_filter 返回意外的长值

    尝试在 Woocommerce 中删除标签并过滤值 但无法以正确的格式获取它 有东西有腥味 我正在使用WC gt cart gt get cart subtotal 来检索该值 在此示例中 我的值是 2 429kr 原始返回值是 span
  • 覆盖控制器 Symfony 3.4/4.0

    我目前正在尝试覆盖 FOSUserBundle 中的控制器 在新的文档中 https symfony com doc 3 4 bundles override html https symfony com doc 3 4 bundles o
  • Woocommerce 结账自定义选择字段

    我有以下功能 将选择列表添加到 woo commerce 结账表单中 woocommerce form field airport pickup array type gt select class gt array airport pic
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 表单提交后如何保留选择字段中的选定值?

    我有一个用于将票证上传到数据库的主页 我有一个选择字段 我想保留用户在提交表单之前选择的值 但它没有发生 这是我选择字段的代码
  • Laravel 中只向登录用户显示按钮

    如果我以 John 身份登录 如何才能只显示 John 的红色按钮而不显示 Susan 的红色按钮 测试系统环境 Win10 Laravel5 4 Mysql5 7 19 table class table table responsive
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex

随机推荐

  • 凭借这5步,我30分钟学会了Python爬虫

    在不同公司的许多人可能出于各种原因需要从Internet收集外部数据 分析竞争 汇总新闻摘要 跟踪特定市场的趋势 或者收集每日股票价格以建立预测模型 无论你是数据科学家还是业务分析师 都可能时不时遇到这种情况 并问自己一个永恒的问题 我如何
  • win系统电脑如何打开sketch?

    2 个方法快速使用 Windows 系统打开 Sketch 文件 使用 Adobe XD 打开 Sketch 文件或者使用浏览器中就能做设计的即时设计直接打开 Sketch 文件 众所周知 Sketch 只能在 Mac 电脑上使用 因此只有
  • SQuirrel SQL Client数据库连接工具的配置与使用

    SQuirrel SQL Client介绍 SQuirrel SQL Client是一个用Java写的数据库客户端 用JDBC统一数据库访问接口以后 可以通过一个统一的用户界面来操作MySQL PostgreSQL MSSQL Oracle
  • Java Html嵌入applet 来读取客户端串口

    写在前面 之前没搞过html嵌入applet来读取本地客户端串口 就直接使用RXTXcom jar 来直接读取本机串口 这个是没问题的如下 RXTX 有三个文件 有针对操作系统64 还有32的 1 RXTXcomm jar 导入项目中 2
  • 【LaTeX】矢量图转为pdf格式(为了将高清矢量图插入LaTeX)

    在论文编写的时候 需要插入高清的矢量图 但是不同的图片生成软件 图片处理软件 论文编写软件所支持的矢量图格式都是不一致的 如 matplotlib可以保存的矢量图格式为 svg eps 等 visio可以保存的格式为 svg emf 等 但
  • 聊聊 Java 泛型

    概述 什么是泛型 为什么需要泛型 如何使用 是什么原理 如何改进 这基本上就是我们学习一项技术的正确套路 本文将按照以上顺序展开阐述 介绍我所了解的泛型 什么是泛型 泛型的本质是参数化类型 即给类型指定一个参数 然后在使用时再指定此参数具体
  • Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerExcepti

    问题描述 在异常信息当中我发现到一个redis连接不上的异常 项目当中我使用的是多环境 我运行的时候是运行的dev 这里的 profile active 我们在idea的maven的配置处进行快速的切换 启动项目的时候报的是连接不上redi
  • RabbitMq基础篇-09-channel接口常用几种参数详解

    文章目录 1 背景概述 2 通常参数解释 3 Channel一些Api解释 3 1 basicNack 不确认消息 3 2 basicReject 拒绝消息 3 3 RecoverOk 是否恢复消息到队列 3 4 exchangeDecla
  • PM产品经理面试 面经汇总

    系列文章目录 第一章 如何找到一份PM产品经理的工作 第二章 PM 面试技巧 文章目录 系列文章目录 一 PM面试准备 二 面试流程 1 行测 2 Behavioral Question 3 product design question
  • MySQL--主从复制--01--原理

    MySQL 主从复制 01 原理 一 故事 爸爸在酒店做厨师 正准备做西红柿炒蛋 妈妈也想做 于是让女儿给爸爸打电话 爸爸接到电话后 于是就把他目前正在做的事情 洗菜 切菜 告诉女儿 女儿记在笔记里 妈妈看笔记 按笔记的内容做菜 就这样爸爸
  • 绝对想不到,Chatgpt 优缺点都有这些

    ChatGPT 是一种基于自然语言处理 NLP 模型的对话生成程序 它的核心是通过机器学习算法训练得到的语言模型 GPT Generative Pre trained Transformer 是ChatGPT的基础 这是一种使用Transf
  • 寻找一维数组的连续数值波峰波谷

    如果一维数组中有波峰和波谷 但是波峰会持续好几个同样的数值或者差异很小而不是只有一个数值 波谷同理 要去寻找这种类型的波峰波谷就会有点难度 数据类似这种 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0016790
  • AH协议与ESP协议简析

    http www gxu edu cn college hxhgxy sec COURSE ch12 2 1 htm http www gxu edu cn college hxhgxy sec COURSE ch12 2 2 htm ht
  • MATLAB实现dijkstra算法的障碍物规避

    MATLAB实现dijkstra算法的障碍物规避 在自主导航系统中 机器人需要能够避开障碍物以安全地到达目标点 其中 dijkstra算法是一种常用的路径规划算法 能够在无权重图中求解最短路径 在本篇文章中 我们将介绍如何使用MATLAB实
  • Java 的VO、DTO、TO、BO等概念总结

    当涉及到Java中的数据传输和对象封装时 有几个常见的概念 它们在不同的上下文中具有不同的用途 以下是这些概念的总结 VO Value Object 含义 VO表示值对象 用于封装一组相关的数据字段 通常没有业务逻辑 用途 VO通常用于数据
  • PBFT共识算法原理

    1 容错类型 PBFT假定错误可以是拜占庭类型的 也就是说可以使任意类型的错误 比如节点作恶 说谎等 这有别于crash down类型的错误 raft paxos这类共识算法只能允许crash down类型错误 节点只能crash而不能产生
  • 推荐三款适合运维小白的网络监测工具

    对于刚刚步入职场的运维小白而言 面对工作中的突发情况时常会感到手忙脚乱 为了帮助他们更好地应对这些挑战 本文将介绍三款特别适合运维新手使用的网络监测工具 1 Zabbix是一个功能强大的网络监控系统 可以监视各种网络设备的性能指标 应用的运
  • Python图形界面设计 Tkinter GUI编程组件的使用

    一 学习目标 1 GUI库 2 Tkinter库 3 导入Tkinter库 4 4 Tkinter窗口中显示中文 5 Tkinter 组件 二 重点知识 1 GUI库 GU1 Graphical User Interface 图形用户界面
  • 【Python数据挖掘课程】二.Kmeans聚类数据分析及Anaconda介绍

    这次课程主要讲述一个关于Kmeans聚类的数据分析案例 通过这个案例让同学们简单了解大数据分析的基本流程 以及使用Python实现相关的聚类分析 主要内容包括 1 Anaconda软件的安装过程及简单配置 2 聚类及Kmeans算法介绍 3
  • 使用SoapHeader实现Soap请求验证

    http www laruence com 2010 03 26 1365 html PHP的Soap Extension中 对于SoapServer来说 并没有方法可用得到 处理客户端发送的SoapHeader信息 网上也有很多人认为 只