本文共 1495 字,大约阅读时间需要 4 分钟。
Here's my solution to make SOAP-headers based authentication.
1). First of all we define the decorator class for our service class:
class SOAP_Service_Secure
{
protected $class_name = '';
protected $authenticated = false;
// -----
public function __construct($class_name)
{
$this->class_name = $class_name;
}
public function AuthHeader($Header)
{
if($Header->username == 'foo' && $Header->password == 'bar')
$this->authenticated = true;
}
public function __call($method_name, $arguments)
{
if(!method_exists($this->class_name, $method_name))
throw new Exception('method not found');
$this->checkAuth();
return call_user_func_array(array($this->class_name, $method_name), $arguments);
}
// -----
protected function checkAuth()
{
if(!$this->authenticated)
HTML_Output::error(403);
}
}
?>
2). Then we pass an instance of it to the SoapServer object.
$Service = new SOAP_Service_Secure('My_Service');
$Server = new SoapServer('my-service.wsdl');
$Server->setObject($Service);
$Server->handle();
?>
3). Implementing a client:
$Client = new SoapClient('http://example.com/my-service.wsdl', array(
'exceptions' => true
));
// -----
$AuthHeader = (object) array('username' => 'foo', 'password' => 'bar');
$Headers[] = new SoapHeader('http://example.com', 'AuthHeader', $AuthHeader);
$Client->__setSoapHeaders($Headers);
// -----
$Result = $Client->someMethod();
?>
非常不错!不过看的不是太明白,SOAP_Service_Secure->__call,好像跟 SosapClient->__call,有着关系?望高手指点
应该是在 SOAP_Service_Secure 中找不到 someMethod 方法时,就会调用 __call 方法.
转载地址:http://xaspa.baihongyu.com/