Here‘s my solution to make SOAP-headers based authentication.
1). First of all we define the decorator class for our service class:
<?php
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.
<?php $Service = new SOAP_Service_Secure(‘My_Service‘); $Server = new SoapServer(‘my-service.wsdl‘); $Server->setObject($Service); $Server->handle(); ?>
3). Implementing a client:
<?php $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,有着关系?望高手指点
原文:http://my.oschina.net/skq/blog/344010