Преглед на файлове

Merge branch 'master' of http://git.bjzxtw.org.cn:3000/zxt/admin_consumer

LiuJ преди 1 седмица
родител
ревизия
819cf8421c
променени са 2 файла, в които са добавени 106 реда и са изтрити 87 реда
  1. 74 53
      app/Controller/LoginController.php
  2. 32 34
      app/Middleware/Auth/FooMiddleware.php

+ 74 - 53
app/Controller/LoginController.php

@@ -16,6 +16,7 @@ use Hyperf\Validation\Contract\ValidatorFactoryInterface;
 use \Phper666\JWTAuth\JWT;
 use App\Model\UserToken;
 use Hyperf\HttpServer\Response;
+use Hyperf\HttpMessage\Cookie\Cookie;
 /**
  * @AutoController()
  */
@@ -62,7 +63,7 @@ class LoginController extends AbstractController
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
-    //    $comm = new CommonService();
+        //    $comm = new CommonService();
         // $redis = $this->container->get(\Hyperf\Redis\Redis::class);
         // $code = $redis->get($reqData['code']);
         // if (empty($code)) {
@@ -98,11 +99,11 @@ class LoginController extends AbstractController
                 'SiteId'=>Context::get("SiteId")
             ];
             var_dump("参数:",$authData);
-           $resultAuth =  $this->checkUserAuth($authData);
+            $resultAuth =  $this->checkUserAuth($authData);
 
-           if(!$resultAuth){
-               return Result::error("您没有权限登陆此网站");
-           }
+            if(!$resultAuth){
+                return Result::error("您没有权限登陆此网站");
+            }
         }
         $userData = [
             'uid' => $userInfos['data']['id'], // 如果使用单点登录,必须存在配置文件中的sso_key的值,一般设置为用户的id
@@ -117,21 +118,21 @@ class LoginController extends AbstractController
         // 检查是否有旧的token
         $old_token = UserToken::where('user_id', $userData['uid'])->first();
         if (!empty($old_token)) {
-                $jwt->logout($old_token->token);
-                try {
-                    $jwt->verifyToken($old_token->token);
-                }catch (\Exception $exception){
-                    $code = $exception->getCode();
-                    if ($code== 400) {
-                        $new_token = UserToken::where('user_id', $userData['uid'])->update(['token' => $token->toString()]);
-                        if (empty($new_token)) {
-                            return Result::error("Token过期失败!");
-                        }
-                        
-                    } else{
+            $jwt->logout($old_token->token);
+            try {
+                $jwt->verifyToken($old_token->token);
+            }catch (\Exception $exception){
+                $code = $exception->getCode();
+                if ($code== 400) {
+                    $new_token = UserToken::where('user_id', $userData['uid'])->update(['token' => $token->toString()]);
+                    if (empty($new_token)) {
                         return Result::error("Token过期失败!");
                     }
+
+                } else{
+                    return Result::error("Token过期失败!");
                 }
+            }
         }else{
             $usernew_token = $token->toString();
             $user_token =  UserToken::create([
@@ -373,8 +374,8 @@ class LoginController extends AbstractController
             return Result::error($errorMessage);
         }
         try {
-           $status =  $jwt->verifyToken($reqData['token']);
-           var_dump("状态:",$status);
+            $status =  $jwt->verifyToken($reqData['token']);
+            //   var_dump("状态:",$status);
             return Result::success(['isLogin' => true]);
         }catch(\Exception $e){
             return Result::error('token已过期:'.$e->getMessage());
@@ -450,8 +451,12 @@ class LoginController extends AbstractController
     {
         // 获取请求数据并设置默认值
         $reqData = $this->request->all();
+
+        // 安全过滤 Admin-Token 和 ticket
+        $cookieList = $this->request->getCookieParams();
         // 安全过滤 Admin-Token 和 ticket
-        $adminToken = !empty($_COOKIE['Admin-Token']) ? $this->sanitizeInput($_COOKIE['Admin-Token']) : '';
+        $adminToken = !empty($cookieList['Admin-Token']) ? $this->sanitizeInput($cookieList['Admin-Token']) : '';
+
         $ticket = !empty($reqData['ticket']) ? $this->sanitizeInput($reqData['ticket']) : '';
         $backurl = $this->sanitizeBackUrl($reqData['backurl'] ?? $_SERVER['HTTP_REFERER'] ?? '');
 
@@ -460,36 +465,33 @@ class LoginController extends AbstractController
         if (empty($theHost)) {
             return Result::error('系统配置错误:THE_HOST 未定义');
         }
-
+        var_dump("admintoken:",$adminToken);
         // 如果存在 adminToken,则进行登录校验
         if (!empty($adminToken)) {
-            try {
-                $redis = $this->container->get(\Hyperf\Redis\Redis::class);
-
-                // 如果 ticket 存在且有效,则直接跳转
+            // 处理登录
+            $redis = $this->container->get(\Hyperf\Redis\Redis::class);
+            var_dump("ticket1111:",$ticket);
+            if(!empty($ticket)){
                 if (!empty($ticket) && $redis->exists('ticket:' . $ticket)) {
-                    $this->redirectWithTicket($backurl, $ticket, $adminToken);
-    //                return;
-                }
 
-                // 如果 ticket 不存在或无效,则重新生成 ticket 并跳转
-                if (empty($ticket)) {
-                    $ticket = md5($adminToken);
+                    $backurl = rtrim($backurl, '/');
+                    return $this->response->redirect($this->fun_http($backurl . '?ticket=' . $ticket . '&admintoken=' . urlencode($adminToken)), 302);
+
+                }else{
+                    var_dump("222222222:");
+                    return $this->response->redirect($this->fun_http('http://'.$theHost.'/#/login?backurl='.urlencode($backurl)), 302);
                 }
 
-                // 跳转到目标页面
-                $this->redirectWithTicket($backurl, $ticket, $adminToken);
-    //            return;
-            } catch (\Throwable $e) {
-                // 记录异常日志
-//                \Hyperf\Logger\LoggerFactory::get('default')->error('Redis 操作失败: ' . $e->getMessage());
-                // 捕获 Redis 异常,返回错误信息
-                return Result::error('系统错误:Redis 操作失败');
+            }else{
+                $ticket = md5($adminToken);
             }
+            var_dump("333333333333333:");
+            return $this->response->redirect($this->fun_http($backurl . '?ticket=' . $ticket . '&admintoken=' . urlencode($adminToken)), 302);
+
+        }else{
+            var_dump("444444444444444:");
+            return $this->response->redirect($this->fun_http('http://'.$theHost.'/#/login?backurl='.urlencode($backurl)), 302);
         }
-        // 如果没有 adminToken,则跳转到登录页面
-        $loginUrl = 'http://' . $theHost . '/#/login?backurl=' . urlencode($backurl);
-        return $this->response->redirect($loginUrl, 302);
     }
 
     /**
@@ -524,6 +526,9 @@ class LoginController extends AbstractController
     {
         $backurl = rtrim($backurl, '/');
         $redirectUrl = $this->fun_http($backurl . '?ticket=' . $ticket . '&admintoken=' . urlencode($adminToken));
+
+//        $loginUrl = 'http://' . $theHost . '/#/login?backurl=' . urlencode($backurl);
+//        return $this->response->redirect($loginUrl, 302);
         return $this->response->redirect($redirectUrl, 302);
     }
 
@@ -547,6 +552,7 @@ class LoginController extends AbstractController
      */
     public function logout(Jwt $jwt)
     {
+
         $reqData = $this->request->all();
         $validator = $this->validationFactory->make(
             $reqData,
@@ -565,22 +571,26 @@ class LoginController extends AbstractController
         }
         $redis = $this->container->get(\Hyperf\Redis\Redis::class);
         $ticket = md5($reqData['admintoken']);
-        $isDel = 0;
-        if ($redis->exists('ticket:' . $ticket)) {
-            $res = $redis->del('ticket:' . $ticket);
-            if (!!$res && $res == 1) $isDel = 1;
-        }else{
-            $isDel = 1;
-        }
-        setcookie("Admin-Token", "", time(), "/");
+
+        $res = $redis->del('ticket:' . $ticket);
+        var_dump("删除redis:", $res);
+        var_dump("获取redis:", $redis->get('ticket:' . $ticket));
+        $expire = time();
+        $cookieName = 'Admin-Token';
+        // 创建 Cookie 实例
+        $cookie = new Cookie($cookieName, '', $expire, '/');
+        // 清空 Cookie
+        $r = $this->response = $this->response->withCookie($cookie);
+        var_dump("清空Cookie:", $r);
         try {
             $jwt->logout($reqData['admintoken']);
-
         }catch (\Exception $e){
-            $backurl = $this->fun_http($reqData['backurl']);
-            return $this->response->redirect($backurl, 302);
+            var_dump("返回错误信息:",$e->getMessage());
+//            $backurl = $this->fun_http($reqData['backurl']);
+//            return $this->response->redirect($backurl, 302);
         }
         $backurl = $this->fun_http($reqData['backurl']);
+        var_dump("返回地址:",$backurl);
         return $this->response->redirect($backurl, 302);
     }
 
@@ -590,7 +600,9 @@ class LoginController extends AbstractController
      */
     public function backlogin()
     {
+
         $reqData = $this->request->all();
+        var_dump("===============接收参数:",$reqData);
         $validator = $this->validationFactory->make(
             $reqData,
             [
@@ -609,9 +621,18 @@ class LoginController extends AbstractController
         $redis = $this->container->get(\Hyperf\Redis\Redis::class);
         $ticket = md5($reqData['token']);
         $res = $redis->set('ticket:' . $ticket, $reqData['token'],  3600*24);
+        var_dump("===============返回值:",$res);
+        $expire = time()+3600*24;
+        $cookieName = 'Admin-Token';
+        // 创建 Cookie 实例
+        $cookie = new Cookie($cookieName, $reqData['token'], $expire, '/');
+        // 清空 Cookie
+        $r = $this->response = $this->response->withCookie($cookie);
+        var_dump("设置token:", $r);
         if($res && !empty($ticket)){
             $url = $reqData['backurl'] . '/?ticket=' . $ticket . '&admintoken=' . urlencode($reqData['token']);
             $url = $this->fun_http($url);
+            var_dump("跳转地址gogo:",$url);
             return $this->response->redirect($url, 302);
         }
     }

+ 32 - 34
app/Middleware/Auth/FooMiddleware.php

@@ -39,23 +39,22 @@ class FooMiddleware implements MiddlewareInterface
 
     public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
     {
+
         $header = $request->getHeaders();
         try {
             if($header &&  isset($header['token']) && $header['token'][0]!='null' && $header['token'][0]!='' && isset($header['token'][0])){
+//                var_dump("token类型:",$header['token'][0]);
                 $ver = $this->JWT->getClaimsByToken($header['token'][0]);
                 $tokenTime =  $this->JWT->getTokenDynamicCacheTime($header['token'][0]);
-                
                 if($tokenTime==0){
-                    $response = $this->response->withStatus(401)
-                        ->withHeader('Content-Type', 'application/json')
-                        ->withBody(new \Hyperf\HttpMessage\Stream\SwooleStream(json_encode([
-                            'code' => -1,
-                            'data' => [],
-                            'message' => 'token无效,请重新登录'
-                        ])));
-                    return $response;
+                   return $this->response->json(
+                       [
+                           'code' => -1,
+                           'data' => [],
+                           'message' => 'token无效,请重新登录',
+                       ]
+                   );
                 }
-
                 if($header['userurl'] && $header['userurl'][0]){
                     $origin = $header['userurl'][0];
                     $data = [
@@ -64,44 +63,43 @@ class FooMiddleware implements MiddlewareInterface
 
                     $result = $this->websiteServiceClient->getWebsiteId($data);
                     if(!isset($result['data']['id']) || !$result['data']['id']){
-                        $response = $this->response->withStatus(404)
-                            ->withHeader('Content-Type', 'application/json')
-                            ->withBody(new \Hyperf\HttpMessage\Stream\SwooleStream(json_encode([
+                        return $this->response->json(
+                            [
                                 'code' => -1,
                                 'data' => [],
-                                'message' => '网站不存在...'
-                            ])));
-                        return $response;
+
+                                'message' => '网站不存在...',
+                            ]
+                        );
                     }
                     Context::set("SiteId",$result['data']['id']);
                 }
-
+//                var_dump("中间件:",$ver);
                 Context::set("UserId",$ver['uid']);
                 Context::set("TypeId",$ver['type_id']);
-                
                 if ($ver) {
                     return $handler->handle($request);
                 }
+            }else{
+                return $this->response->json(
+                    [
+                        'code' => -1,
+                        'data' => [],
+                        'message' => 'token无效,请重新登录',
+                    ]
+                );
             }
 
-            $response = $this->response->withStatus(401)
-                ->withHeader('Content-Type', 'application/json')
-                ->withBody(new \Hyperf\HttpMessage\Stream\SwooleStream(json_encode([
-                    'code' => -1,
-                    'data' => [],
-                    'message' => 'token无效,请重新登录'
-                ])));
-            return $response;
-
-        } catch (\Exception $e) {
-            $response = $this->response->withStatus(500)
-                ->withHeader('Content-Type', 'application/json')
-                ->withBody(new \Hyperf\HttpMessage\Stream\SwooleStream(json_encode([
+        }catch (\Exception $e){
+            var_dump("错误消息1:",$e->getMessage(),$e->getCode());
+            return $this->response->json(
+                [
                     'code' => $e->getCode(),
                     'data' => [],
-                    'message' => $e->getMessage()
-                ])));
-            return $response;
+                    'message' => $e->getMessage(),
+                ]
+            );
         }
+        return false;
     }
 }