From 21939ae1aa7b86dbf5b8bbaa4d52997cb0be384f Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Sun, 26 Sep 2021 13:15:22 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Doidc=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=8A=A5=E9=94=99=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/plugins/server/SSOServer.java | 84 ++++++++++++------- frontend/src/views/login/index.vue | 3 +- 2 files changed, 54 insertions(+), 33 deletions(-) diff --git a/backend/src/main/java/io/dataease/plugins/server/SSOServer.java b/backend/src/main/java/io/dataease/plugins/server/SSOServer.java index a102174941..9ca599e40b 100644 --- a/backend/src/main/java/io/dataease/plugins/server/SSOServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/SSOServer.java @@ -1,5 +1,7 @@ package io.dataease.plugins.server; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -39,39 +41,57 @@ public class SSOServer { @GetMapping("/callBack") public ModelAndView callBack(@RequestParam("code") String code, @RequestParam("state") String state) { - Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType((OidcXpackService.class)); - if(beansOfType.keySet().size() == 0) { - DEException.throwException("缺少oidc插件"); - } - OidcXpackService oidcXpackService = SpringContextUtil.getBean(OidcXpackService.class); - Boolean suuportOIDC = oidcXpackService.isSuuportOIDC(); - if (!suuportOIDC) { - DEException.throwException("未开启oidc"); - } - Map config = config(oidcXpackService); - SSOToken ssoToken = oidcXpackService.requestSsoToken(config, code, state); - - SSOUserInfo ssoUserInfo = oidcXpackService.requestUserInfo(config, ssoToken.getAccessToken()); - SysUserEntity sysUserEntity = authUserService.getUserBySub(ssoUserInfo.getSub()); - if(null == sysUserEntity){ - sysUserService.validateExistUser(ssoUserInfo.getUsername(), ssoUserInfo.getEmail()); - sysUserService.saveOIDCUser(ssoUserInfo); - sysUserEntity = authUserService.getUserBySub(ssoUserInfo.getSub()); - } - TokenInfo tokenInfo = TokenInfo.builder().userId(sysUserEntity.getUserId()).username(sysUserEntity.getUsername()).build(); - String realPwd = CodingUtil.md5(sysUserService.defaultPWD()); - String token = JWTUtils.sign(tokenInfo, realPwd); - ServletUtils.setToken(token); - HttpServletResponse response = ServletUtils.response(); - - Cookie cookie_token = new Cookie("Authorization", token);cookie_token.setPath("/"); - Cookie cookie_id_token = new Cookie("IdToken", ssoToken.getIdToken());cookie_id_token.setPath("/"); - Cookie cookie_ac_token = new Cookie("AccessToken", ssoToken.getAccessToken());cookie_ac_token.setPath("/"); + ModelAndView modelAndView = new ModelAndView("redirect:/"); + HttpServletResponse response = ServletUtils.response(); - response.addCookie(cookie_token); - response.addCookie(cookie_id_token); - response.addCookie(cookie_ac_token); - ModelAndView modelAndView = new ModelAndView("redirect:/"); + try { + Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType((OidcXpackService.class)); + if(beansOfType.keySet().size() == 0) { + DEException.throwException("缺少oidc插件"); + } + OidcXpackService oidcXpackService = SpringContextUtil.getBean(OidcXpackService.class); + Boolean suuportOIDC = oidcXpackService.isSuuportOIDC(); + if (!suuportOIDC) { + DEException.throwException("未开启oidc"); + } + Map config = config(oidcXpackService); + SSOToken ssoToken = oidcXpackService.requestSsoToken(config, code, state); + + SSOUserInfo ssoUserInfo = oidcXpackService.requestUserInfo(config, ssoToken.getAccessToken()); + SysUserEntity sysUserEntity = authUserService.getUserBySub(ssoUserInfo.getSub()); + if(null == sysUserEntity){ + sysUserService.validateExistUser(ssoUserInfo.getUsername(), ssoUserInfo.getEmail()); + sysUserService.saveOIDCUser(ssoUserInfo); + sysUserEntity = authUserService.getUserBySub(ssoUserInfo.getSub()); + } + TokenInfo tokenInfo = TokenInfo.builder().userId(sysUserEntity.getUserId()).username(sysUserEntity.getUsername()).build(); + String realPwd = CodingUtil.md5(sysUserService.defaultPWD()); + String token = JWTUtils.sign(tokenInfo, realPwd); + ServletUtils.setToken(token); + + + Cookie cookie_token = new Cookie("Authorization", token);cookie_token.setPath("/"); + Cookie cookie_id_token = new Cookie("IdToken", ssoToken.getIdToken());cookie_id_token.setPath("/"); + Cookie cookie_ac_token = new Cookie("AccessToken", ssoToken.getAccessToken());cookie_ac_token.setPath("/"); + + response.addCookie(cookie_token); + response.addCookie(cookie_id_token); + response.addCookie(cookie_ac_token); + }catch(Exception e) { + String msg; + try { + msg = URLEncoder.encode(e.getMessage(), "UTF-8"); + Cookie cookie_error = new Cookie("OidcError", msg); + cookie_error.setPath("/"); + response.addCookie(cookie_error); + return modelAndView; + } catch (UnsupportedEncodingException e1) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } return modelAndView; } private Map config(OidcXpackService oidcXpackService) { diff --git a/frontend/src/views/login/index.vue b/frontend/src/views/login/index.vue index 552452644a..2b9bb297e2 100644 --- a/frontend/src/views/login/index.vue +++ b/frontend/src/views/login/index.vue @@ -66,6 +66,7 @@ import { encrypt } from '@/utils/rsaEncrypt' import { ldapStatus, oidcStatus } from '@/api/user' import { getSysUI } from '@/utils/auth' import PluginCom from '@/views/system/plugin/PluginCom' +import Cookies from 'js-cookie' export default { name: 'Login', components: { PluginCom }, @@ -92,7 +93,7 @@ export default { }, computed: { msg() { - return this.$store.state.user.loginMsg + return this.$store.state.user.loginMsg || Cookies.get('OidcError') } }, watch: {