1在PhalApi框架中有过滤器filterCheck,拦截所有接口
在注册好统一的接口验签的过滤器拦截服务后,是会存在这样一种情况:即个别的接口不需要签名
除了可以像上面这样编码实现,排除个别接口服务的接口验证,还可以使用接口服务白名单配置,通过框架自身实现对指定配置的接口服务排除。即调用的接口服务,如果配置了白名单,则不调用过滤器。
接口服务白名单配置是:app.service_whitelist
2模仿该过滤器可以重构某些接口需要授权过滤名单
(1)配置参数
/**
* 登录授权名单格式:接口服务类名.接口服务方法名
*
* 示例:
* - *.* 通配,全部接口服务,慎用!
* - Default.* Api_Default接口类的全部方法
* - *.Index 全部接口类的Index方法
* - Default.Index 指定某个接口服务,即Api_Default::Index()
/*
* 登录授权名单
*/
'login_list' => array(
'Holiday.getHouseOwnerInfo',
'House.getHouseIndex',
'House.AddHouse',
'House.editHouse',
'Order.*',}
(2)/**
* 验证是否是登录名单内接口方法
*/
protected function isLoginWhitelist(){
$api = DI()->request->getServiceApi();
$action = DI()->request->getServiceAction();
$serviceWhitelist = DI()->config->get('app.login_list', array());
foreach ($serviceWhitelist as $item) {
$cfgArr = explode('.', $item);
if (count($cfgArr) < 2) {
continue;
}
// 短路返回
if ($this->equalOrIngore($api, $cfgArr[0]) && $this->equalOrIngore($action, $cfgArr[1])) {
return FALSE;
}
}
return TRUE;
}
(3)验证登录时过滤登录名单protected function userCheck(){
// 过滤必须授权名单
if($this->isLoginWhitelist()) {
return;
}
$key = isset($_POST['Key']) ? $_POST['Key'] : '';
if (empty($key)) {
$key = isset($_GET['Key']) ? $_GET['Key'] : '';
}
$member_domain = new Domain_Member();
$token_info = $member_domain->getMebertoken($key);
if ($token_info) {
$condition = array();
$condition['member_id'] = $token_info['member_id'];
$this->member_info = $member_domain->getMmberInfo($condition);
if ($this->member_info) {
} else {
throw new PhalApi_Exception_BadRequest('请登录!', 20); }
} else {
throw new PhalApi_Exception_BadRequest('请登录!', 20);
}
}