From 4f064dc23bd128baecabfb385efce6fa067f8058 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Sun, 26 Sep 2021 16:49:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=E5=8D=95=E7=82=B9?= =?UTF-8?q?=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/plugins/server/SSOServer.java | 31 ++++++++++++++----- .../dataease/service/sys/SysUserService.java | 2 +- frontend/src/views/login/index.vue | 16 ++++++++-- 3 files changed, 37 insertions(+), 12 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 9ca599e40b..0126d03e52 100644 --- a/backend/src/main/java/io/dataease/plugins/server/SSOServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/SSOServer.java @@ -9,6 +9,7 @@ import java.util.stream.Collectors; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @@ -21,6 +22,7 @@ import io.dataease.auth.service.AuthUserService; import io.dataease.auth.util.JWTUtils; import io.dataease.commons.exception.DEException; import io.dataease.commons.utils.CodingUtil; +import io.dataease.commons.utils.LogUtil; import io.dataease.commons.utils.ServletUtils; import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.display.dto.response.SysSettingDto; @@ -43,21 +45,27 @@ public class SSOServer { public ModelAndView callBack(@RequestParam("code") String code, @RequestParam("state") String state) { ModelAndView modelAndView = new ModelAndView("redirect:/"); HttpServletResponse response = ServletUtils.response(); - + OidcXpackService oidcXpackService = null; + String idToken = null; try { Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType((OidcXpackService.class)); if(beansOfType.keySet().size() == 0) { DEException.throwException("缺少oidc插件"); } - OidcXpackService oidcXpackService = SpringContextUtil.getBean(OidcXpackService.class); + oidcXpackService = SpringContextUtil.getBean(OidcXpackService.class); Boolean suuportOIDC = oidcXpackService.isSuuportOIDC(); if (!suuportOIDC) { DEException.throwException("未开启oidc"); } - Map config = config(oidcXpackService); + Map config = config(oidcXpackService); SSOToken ssoToken = oidcXpackService.requestSsoToken(config, code, state); + idToken = ssoToken.getIdToken(); + Cookie cookie_id_token = new Cookie("IdToken", ssoToken.getIdToken());cookie_id_token.setPath("/"); + response.addCookie(cookie_id_token); SSOUserInfo ssoUserInfo = oidcXpackService.requestUserInfo(config, ssoToken.getAccessToken()); + + SysUserEntity sysUserEntity = authUserService.getUserBySub(ssoUserInfo.getSub()); if(null == sysUserEntity){ sysUserService.validateExistUser(ssoUserInfo.getUsername(), ssoUserInfo.getEmail()); @@ -71,22 +79,29 @@ public class SSOServer { 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; + + String msg = e.getMessage(); + if (null != e.getCause()) { + msg = e.getCause().getMessage(); + } try { - msg = URLEncoder.encode(e.getMessage(), "UTF-8"); + msg = URLEncoder.encode(msg, "UTF-8"); + LogUtil.error(e); Cookie cookie_error = new Cookie("OidcError", msg); cookie_error.setPath("/"); response.addCookie(cookie_error); + if (ObjectUtils.isNotEmpty(oidcXpackService) && ObjectUtils.isNotEmpty(idToken)) { + oidcXpackService.logout(idToken); + } return modelAndView; } catch (UnsupportedEncodingException e1) { - // TODO Auto-generated catch block e.printStackTrace(); } diff --git a/backend/src/main/java/io/dataease/service/sys/SysUserService.java b/backend/src/main/java/io/dataease/service/sys/SysUserService.java index 2a102f7d94..dfd8c7e020 100644 --- a/backend/src/main/java/io/dataease/service/sys/SysUserService.java +++ b/backend/src/main/java/io/dataease/service/sys/SysUserService.java @@ -316,7 +316,7 @@ public class SysUserService { throw new RuntimeException("用户姓名【"+nickName+"】已存在,请联系管理员"); } } */ - + example.clear(); if (StringUtils.isNotBlank(email)) { example.createCriteria().andEmailEqualTo(email); List users = sysUserMapper.selectByExample(example); diff --git a/frontend/src/views/login/index.vue b/frontend/src/views/login/index.vue index 9bc7ec3c83..9d321b8f59 100644 --- a/frontend/src/views/login/index.vue +++ b/frontend/src/views/login/index.vue @@ -93,7 +93,7 @@ export default { }, computed: { msg() { - return this.$store.state.user.loginMsg || Cookies.get('OidcError') + return this.$store.state.user.loginMsg } }, watch: { @@ -126,8 +126,18 @@ export default { }).catch(err => { console.error(err) }) + let msg = Cookies.get('OidcError') + if (msg) { + msg = msg.replace('+', '') + this.$error(msg) + } + this.clearOidcMsg() }, methods: { + clearOidcMsg() { + Cookies.remove('OidcError') + Cookies.remove('IdToken') + }, showLoginImage() { this.uiInfo = getSysUI() if (this.uiInfo['ui.loginImage'] && this.uiInfo['ui.loginImage'].paramValue) { @@ -138,7 +148,7 @@ export default { } }, handleLogin() { - Cookies.remove('OidcError') + this.clearOidcMsg() this.$refs.loginForm.validate(valid => { if (valid) { this.loading = true @@ -161,7 +171,7 @@ export default { }, changeLoginType(val) { if (val !== 2) return - Cookies.remove('OidcError') + this.clearOidcMsg() this.$nextTick(() => { })