From f40c0ef6e7dcbfab0f6796ffbc79649d9a5c8715 Mon Sep 17 00:00:00 2001 From: wh <382379437@qq.com> Date: Tue, 25 Mar 2025 13:47:17 +0800 Subject: [PATCH] update --- admin/application/admin/common.php | 5 ++ .../admin/controller/auth/Admin.php | 7 ++ .../admin/view/auth/admin/add.html | 28 +++++++ .../admin/view/auth/admin/edit.html | 33 +++++++- admin/application/admin/view/firm/add.html | 13 +-- admin/application/admin/view/firm/edit.html | 13 +-- .../admin/view/firmcustomer/add.html | 9 ++- .../admin/view/firmcustomer/edit.html | 10 ++- .../api/controller/BaseApiAuthController.php | 81 +++++++++++++++++++ .../controller/BaseApiPublicController.php | 17 ++++ .../api/controller/Firmemployee.php | 43 ++++++++++ admin/application/api/logic/TokenLogic.php | 3 + admin/application/common/model/ApiKey.php | 24 ++++++ .../common/service/AuthService.php | 47 +++++++++++ .../index/controller/Tasktimer.php | 26 ++++++ admin/public/assets/js/backend/auth/admin.js | 1 + admin/public/assets/js/backend/firm.js | 2 - .../api/middleware/AuthMiddleware.php | 47 +++++++++++ 18 files changed, 377 insertions(+), 32 deletions(-) create mode 100644 admin/application/api/controller/BaseApiAuthController.php create mode 100644 admin/application/api/controller/BaseApiPublicController.php create mode 100644 admin/application/api/controller/Firmemployee.php create mode 100644 admin/application/common/model/ApiKey.php create mode 100644 admin/application/common/service/AuthService.php create mode 100644 admin/application/index/controller/Tasktimer.php create mode 100644 front/application/api/middleware/AuthMiddleware.php diff --git a/admin/application/admin/common.php b/admin/application/admin/common.php index 6645280..623e65c 100644 --- a/admin/application/admin/common.php +++ b/admin/application/admin/common.php @@ -10,6 +10,11 @@ if (!function_exists('build_select')) { /** * 生成下拉列表 + * + * 示例: + * {:build_select('row[type]', $business_type, null, ['class'=>'form-control', 'required'=>''])} + * + * 从左到右 name,数组数据,是否选择,扩展数据(class或者验证等) * @param string $name * @param mixed $options * @param mixed $selected diff --git a/admin/application/admin/controller/auth/Admin.php b/admin/application/admin/controller/auth/Admin.php index 85f8fb4..b869ee1 100644 --- a/admin/application/admin/controller/auth/Admin.php +++ b/admin/application/admin/controller/auth/Admin.php @@ -4,6 +4,7 @@ namespace app\admin\controller\auth; use app\admin\model\AuthGroup; use app\admin\model\AuthGroupAccess; +use app\api\logic\GewechatFriendsLogic; use app\common\controller\Backend; use fast\Random; use fast\Tree; @@ -294,4 +295,10 @@ class Admin extends Backend $this->dataLimitField = 'id'; return parent::selectpage(); } + + function getRelWxids(){ + $friends = (new GewechatFriendsLogic())->getFriendDetailList(); + + return json(['data'=>$friends,'total'=>count($friends)]); + } } diff --git a/admin/application/admin/view/auth/admin/add.html b/admin/application/admin/view/auth/admin/add.html index 5a85e46..27df3fa 100644 --- a/admin/application/admin/view/auth/admin/add.html +++ b/admin/application/admin/view/auth/admin/add.html @@ -42,6 +42,26 @@ {:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')])} +
+ +
+ +
+
+
+ +
+ {:build_radios('row[employee_type]', ['1'=>'企业微信', '2'=>'个人微信'])} +
+
+
+ +
+ {:build_radios('row[role]', ['admin'=>'系统管理员', 'firm'=>'企业员工'])} +
+
@@ -61,6 +81,14 @@ name="row[firmstore_id]" type="text" value="{:session_admin_firmstore_id()}">
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ {:build_radios('row[employee_type]', ['1'=>'企业微信', '2'=>'个人微信'], $row.employee_type)} +
+
+
+ +
+ {:build_radios('row[role]', ['admin'=>'系统管理员', 'firm'=>'企业管理员'],$row.role)} +
+
@@ -55,17 +75,26 @@
- +
- +
+ + + + + +
{:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')], $row['status'])}
+ -
- -
- -
-
-
- -
- -
-
+
diff --git a/admin/application/admin/view/firm/edit.html b/admin/application/admin/view/firm/edit.html index 1e37e5f..f93b85e 100644 --- a/admin/application/admin/view/firm/edit.html +++ b/admin/application/admin/view/firm/edit.html @@ -18,18 +18,7 @@
-
- -
- -
-
-
- -
- -
-
+
diff --git a/admin/application/admin/view/firmcustomer/add.html b/admin/application/admin/view/firmcustomer/add.html index 66be1d9..115ef60 100644 --- a/admin/application/admin/view/firmcustomer/add.html +++ b/admin/application/admin/view/firmcustomer/add.html @@ -76,13 +76,18 @@
- +
- +
diff --git a/admin/application/admin/view/firmcustomer/edit.html b/admin/application/admin/view/firmcustomer/edit.html index 5d38b10..18e9992 100644 --- a/admin/application/admin/view/firmcustomer/edit.html +++ b/admin/application/admin/view/firmcustomer/edit.html @@ -66,13 +66,19 @@
- +
- +
diff --git a/admin/application/api/controller/BaseApiAuthController.php b/admin/application/api/controller/BaseApiAuthController.php new file mode 100644 index 0000000..1f15842 --- /dev/null +++ b/admin/application/api/controller/BaseApiAuthController.php @@ -0,0 +1,81 @@ +requestAuth($request); + if(false === $r){ + echo json_encode(['code'=>500,'msg'=>'认证失败,请重新登录']);die; + } + //if(false == $this->defaultAuth()){ + // echo json_encode(['code'=>500,'msg'=>'鉴权失败,缺失必要参数']);die; + //} + } + + //请求认证 + function requestAuth($request){ + return true; + // 获取Authorization头 + $authHeader = $request->header('authorization'); + + if (!$authHeader) { + echo json_encode(['code' => 401, 'error' => 'Missing Authorization header']);die; + } + // 解析Bearer Token + if (!preg_match('/Bearer\s(\S+)/', $authHeader, $matches)) { + //return json(['code' => 401, 'error' => 'Invalid token format'], 401); + echo json_encode(['code' => 401, 'error' => 'Invalid token format']);die; + } + + $apiKey = $matches[1]; + return (new AuthService($apiKey))->verifyApiKey(); + } + + /** + * desc:默认鉴权 + * author:wh + * @return bool + */ + function defaultAuth(){ + $params = input(); + if(empty($params['nonce'])){ + //Tools::log_to_write_txt(['服务被拒绝,鉴权参数缺失:nonce。params'=>input()]); + return false; + } + if(empty($params['timestamp'])){ + //Tools::log_to_write_txt(['服务被拒绝,鉴权参数缺失:timestamp。params'=>input()]); + return false; + } + if(empty($params['sign'])){ + //Tools::log_to_write_txt(['服务被拒绝,鉴权参数缺失:sign。params'=>input()]); + return false; + } + $sign = $params['sign']; + unset($params['sign']); + if(Tools::signature($params) != $sign){ + //Tools::log_to_write_txt(['签名失败,服务被拒绝.'=>input()]); + return false; + } + return true; + } + +} \ No newline at end of file diff --git a/admin/application/api/controller/BaseApiPublicController.php b/admin/application/api/controller/BaseApiPublicController.php new file mode 100644 index 0000000..0d66e7b --- /dev/null +++ b/admin/application/api/controller/BaseApiPublicController.php @@ -0,0 +1,17 @@ +where('role','firm') + ->where('firm_id',$firm_sign) + ->select(); + + return Tools::set_ok('ok',[ + 'staff_list'=>array_column($info,'rel_wxid') + ]); + }); + } +} \ No newline at end of file diff --git a/admin/application/api/logic/TokenLogic.php b/admin/application/api/logic/TokenLogic.php index 123ed4d..e73dee6 100644 --- a/admin/application/api/logic/TokenLogic.php +++ b/admin/application/api/logic/TokenLogic.php @@ -26,6 +26,9 @@ class TokenLogic extends BaseLogic { $url = 'https://wechat-api-test.excn.vip/vip_groups/auth_info'; $res = \wanghua\general_utility_tools_php\http\Curl::curl_post($url, []); + if(empty($res['data'])){ + throw new \Exception('获取token失败'); + } $res_data = json_decode($res['data'], true); return [ 'token' => $res_data['gewe-token'], diff --git a/admin/application/common/model/ApiKey.php b/admin/application/common/model/ApiKey.php new file mode 100644 index 0000000..50fb555 --- /dev/null +++ b/admin/application/common/model/ApiKey.php @@ -0,0 +1,24 @@ +keyInfo = ApiKey::where('api_key', $apiKey) + ->cache("api_key_{$apiKey}", 300) // 缓存5分钟 + ->find(); + } + public function verifyApiKey() + { + // 查询数据库(带缓存) + $keyInfo = $this->keyInfo; + + if (!$keyInfo) { + return false; + } + + // 检查密钥状态 + if (!$keyInfo->is_active || $keyInfo->expires_at < time()) { + return false; + } + + // 记录最后使用时间 + Db::name('api_keys') + ->where('id', $keyInfo->id) + ->update(['last_used_at' => time()]); + + return true; + } + + public function getDeveloperInfo() + { + // 根据业务需求返回开发者信息 + return [ + 'developer_id' => $this->keyInfo->app_name, + 'app_id' => $this->keyInfo->id, + //'permissions' => json_decode($this->keyInfo->permissions, true) + ]; + } +} \ No newline at end of file diff --git a/admin/application/index/controller/Tasktimer.php b/admin/application/index/controller/Tasktimer.php new file mode 100644 index 0000000..8c09501 --- /dev/null +++ b/admin/application/index/controller/Tasktimer.php @@ -0,0 +1,26 @@ +header('authorization'); + + if (!$authHeader) { + return json(['code' => 401, 'error' => 'Missing Authorization header'], 401); + } + + // 解析Bearer Token + if (!preg_match('/Bearer\s(\S+)/', $authHeader, $matches)) { + return json(['code' => 401, 'error' => 'Invalid token format'], 401); + } + + $apiKey = $matches[1]; + $authService = new AuthService($apiKey); + + // 验证密钥有效性 + if (!$authService->verifyApiKey()) { + return json(['code' => 403, 'error' => 'Invalid API key'], 403); + } + + // 将开发者信息注入请求对象 + $request->developer = $authService->getDeveloperInfo(); + + //默认不限流 + + // 在中间件最后记录 + Db::name('api_logs')->insert([ + 'api_key' => $apiKey, + 'endpoint' => $request->url(), + 'ip' => $request->ip(), + //'created_at' => time() + ]); + + + return $next($request); + } +} \ No newline at end of file