From 9d960ed0058f9087f49e9741a9af06c3f9116eb0 Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期六, 19 四月 2025 11:23:02 +0800
Subject: [PATCH] feat(auth): 添加 Keycloak 认证支持

---
 zhitan-framework/src/main/java/com/zhitan/framework/web/service/SysLoginService.java |   77 ++++++++++++++++++++++++++++++++++++++
 1 files changed, 77 insertions(+), 0 deletions(-)

diff --git a/zhitan-framework/src/main/java/com/zhitan/framework/web/service/SysLoginService.java b/zhitan-framework/src/main/java/com/zhitan/framework/web/service/SysLoginService.java
index be2716a..bdb62a4 100644
--- a/zhitan-framework/src/main/java/com/zhitan/framework/web/service/SysLoginService.java
+++ b/zhitan-framework/src/main/java/com/zhitan/framework/web/service/SysLoginService.java
@@ -1,5 +1,7 @@
 package com.zhitan.framework.web.service;
 
+import cn.hutool.core.collection.CollUtil;
+import com.zhitan.common.config.keycloak.AuthKeycloakRequest;
 import com.zhitan.common.constant.CacheConstants;
 import com.zhitan.common.constant.Constants;
 import com.zhitan.common.constant.UserConstants;
@@ -10,14 +12,23 @@
 import com.zhitan.common.exception.user.*;
 import com.zhitan.common.utils.DateUtils;
 import com.zhitan.common.utils.MessageUtils;
+import com.zhitan.common.utils.SocialUtils;
 import com.zhitan.common.utils.StringUtils;
 import com.zhitan.common.utils.ip.IpUtils;
 import com.zhitan.framework.manager.AsyncManager;
 import com.zhitan.framework.manager.factory.AsyncFactory;
 import com.zhitan.framework.security.context.AuthenticationContextHolder;
 import com.zhitan.framework.security.single.SingleAuthenticationToken;
+import com.zhitan.system.domain.SysSocial;
+import com.zhitan.system.domain.bo.SysSocialBo;
+import com.zhitan.system.domain.vo.SysSocialVo;
 import com.zhitan.system.service.ISysConfigService;
+import com.zhitan.system.service.ISysSocialService;
 import com.zhitan.system.service.ISysUserService;
+import me.zhyd.oauth.model.AuthCallback;
+import me.zhyd.oauth.model.AuthResponse;
+import me.zhyd.oauth.model.AuthToken;
+import me.zhyd.oauth.model.AuthUser;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -25,6 +36,7 @@
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * 鐧诲綍鏍¢獙鏂规硶
@@ -48,6 +60,9 @@
 
     @Resource
     private ISysConfigService configService;
+
+    @Resource
+    private ISysSocialService sysSocialService;
 
     /**
      * 鐧诲綍楠岃瘉
@@ -97,6 +112,68 @@
         return tokenService.createToken(loginUser);
     }
 
+
+
+
+
+    public String loginByCode(String code,String state)
+    {
+        AuthKeycloakRequest authRequest = SocialUtils.getAuthKeyloakRequest();
+       // AuthToken accessToken = authRequest.getAccessToken(passwordLoginBody);
+        AuthCallback callback = new AuthCallback();
+        callback.setCode(code);
+        callback.setState(state);
+        AuthResponse<AuthUser> res = authRequest.login(callback);
+        AuthUser authUserData = res.getData();
+        // 鏂板KEYCLOAK鐢ㄦ埛鑷姩鍒涘缓閫昏緫
+        String authId = authUserData.getSource() + authUserData.getUuid();
+        List<SysSocial> list = sysSocialService.selectByAuthId(authId);
+        if (CollUtil.isEmpty(list)) {
+            // 鑷姩鍒涘缓鏂扮敤鎴�
+            SysUser newUser = new SysUser();
+            newUser.setUserName(authUserData.getUsername());
+            newUser.setEmail(authUserData.getEmail());
+            newUser.setNickName(authUserData.getNickname());
+            newUser.setPassword("Initial123@"); // 鍒濆瀵嗙爜闇�绗﹀悎瀹夊叏绛栫暐
+            newUser.setStatus("0");
+
+            userService.insertUser(newUser); // 鍋囪瀛樺湪鎻掑叆鏂规硶
+
+            // 鍒涘缓绀句氦缁戝畾璁板綍
+            SysSocialBo newSocial = new SysSocialBo();
+            newSocial.setUserId(newUser.getUserId());
+            newSocial.setUserName(newUser.getUserName());
+            newSocial.setAuthId(authId);
+            newSocial.setSource(authUserData.getSource());
+            newSocial.setOpenId(authUserData.getUuid());
+            newSocial.setAccessToken(authUserData.getToken().getAccessToken());
+            newSocial.setRefreshToken(authUserData.getToken().getRefreshToken());
+            newSocial.setIdToken(authUserData.getToken().getIdToken());
+            sysSocialService.insertByBo(newSocial); // 闇�纭繚鏈嶅姟鏈夋柊澧炴柟娉�
+
+            // 閲嶆柊鏌ヨ纭繚鏁版嵁鍙敤
+            list = sysSocialService.selectByAuthId(authId);
+        } else {
+            // 鏇存柊绀句氦缁戝畾璁板綍
+            SysSocialBo socialBo = new SysSocialBo();
+            socialBo.setId(list.get(0).getId());
+            socialBo.setAccessToken(authUserData.getToken().getAccessToken());
+            socialBo.setRefreshToken(authUserData.getToken().getRefreshToken());
+            socialBo.setIdToken(authUserData.getToken().getIdToken());
+            sysSocialService.updateByBo(socialBo);
+
+        }
+        list = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid());
+        if (CollUtil.isEmpty(list)) {
+            throw new ServiceException("浣犺繕娌℃湁缁戝畾绗笁鏂硅处鍙凤紝缁戝畾鍚庢墠鍙互鐧诲綍锛�");
+        }
+        LoginUser loginUser = new LoginUser();
+        loginUser.setUser(userService.selectUserById(list.get(0).getUserId()));
+        loginUser.setUserId(list.get(0).getUserId());
+        // 鐢熸垚token
+        return tokenService.createToken(loginUser);
+    }
+
     /**
      * 鏍¢獙楠岃瘉鐮�
      *

--
Gitblit v1.9.3