From ee3ad5e0ddda966beef93f6a91848615cf34ab42 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Fri, 17 Feb 2023 18:37:19 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat(=E7=99=BB=E5=BD=95):=20=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E7=AB=AF=E9=92=89=E9=92=89=E5=B7=A5=E4=BD=9C=E5=8F=B0?= =?UTF-8?q?=E5=85=8D=E7=99=BB=E8=BF=9B=E5=85=A5DE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/dataease/auth/util/JWTUtils.java | 3 +- frontend/src/permission.js | 21 +- mobile/src/common/utils.js | 15 +- mobile/src/pages.json | 370 ++++----- mobile/src/pages/login/index.vue | 713 +++++++++--------- 5 files changed, 582 insertions(+), 540 deletions(-) diff --git a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java index 6d0aaef239..cebe34c5f5 100644 --- a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java +++ b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java @@ -68,7 +68,8 @@ public class JWTUtils { public static boolean needRefresh(String token) { Date exp = JWTUtils.getExp(token); - return new Date().getTime() >= exp.getTime(); + Long advanceTime = 5000L; + return (new Date().getTime() + advanceTime) >= exp.getTime(); } /** diff --git a/frontend/src/permission.js b/frontend/src/permission.js index c5961184b6..c612f949c9 100644 --- a/frontend/src/permission.js +++ b/frontend/src/permission.js @@ -18,9 +18,13 @@ import { changeFavicon } from '@/utils/index' import Layout from '@/layout/index' -import { getSysUI } from '@/utils/auth' +import { + getSysUI +} from '@/utils/auth' -import { getSocket } from '@/websocket' +import { + getSocket +} from '@/websocket' NProgress.configure({ showSpinner: false @@ -53,14 +57,19 @@ const routeBefore = (callBack) => { callBack() } } -router.beforeEach(async (to, from, next) => routeBefore(() => { +router.beforeEach(async(to, from, next) => routeBefore(() => { // start progress bar NProgress.start() - const mobileIgnores = ['/delink'] + const mobileIgnores = ['/delink', '/de-auto-login'] const mobilePreview = '/preview/' + const hasToken = getToken() if (isMobile() && !to.path.includes(mobilePreview) && mobileIgnores.indexOf(to.path) === -1) { - window.location.href = window.origin + '/app.html' + let urlSuffix = '/app.html' + if (hasToken) { + urlSuffix += ('?detoken=' + hasToken) + } + window.location.href = window.origin + urlSuffix NProgress.done() } @@ -68,7 +77,7 @@ router.beforeEach(async (to, from, next) => routeBefore(() => { document.title = getPageTitle(to.meta.title) // determine whether the user has logged in - const hasToken = getToken() + if (hasToken) { if (to.path === '/login') { // if is logged in, redirect to the home page diff --git a/mobile/src/common/utils.js b/mobile/src/common/utils.js index f4c10d9700..2e6fa8b2f7 100644 --- a/mobile/src/common/utils.js +++ b/mobile/src/common/utils.js @@ -142,4 +142,17 @@ export function parseLanguage() { const language = getLanguage() if(language === 'sys') return uni.getLocale() return language -} \ No newline at end of file +} + +export function getUrlParams(url){ + const Params = {} + if(url.indexOf('?')>0){//判断是否有qurey + let parmas = url.slice(url.indexOf('?')+1)//截取出query + const paramlists = parmas.split('&')//分割键值对 + for (const param of paramlists) { + let a = param.split('=') + Object.assign(Params,{[a[0]]:a[1]})//将键值对封装成对象 + } + } + return Params +} diff --git a/mobile/src/pages.json b/mobile/src/pages.json index 1e6be356ac..1fcfb0dc34 100644 --- a/mobile/src/pages.json +++ b/mobile/src/pages.json @@ -1,192 +1,192 @@ { - "pages": [ + "pages": [ + + { + "path": "pages/login/index", + "style": { + "navigationBarTitleText": "%navigate.login%", + "app-plus": { + "titleNView": false + } + } + }, + { + "path": "pages/tabBar/home/index", + "style": { + "navigationBarTitleText": "%navigate.menuHome%", + "app-plus": { + "titleNView": false - { - "path": "pages/login/index", - "style": { - "navigationBarTitleText": "%navigate.login%", - "app-plus": { - "titleNView": false - } - } - }, - { - "path": "pages/tabBar/home/index", - "style": { - "navigationBarTitleText": "%navigate.menuHome%", - "app-plus": { - "titleNView": false - - }, - "enablePullDownRefresh": true - } - }, - - { - "path": "pages/tabBar/home/detail", - "style": { - "navigationBarTitleText": "", - "app-plus": { - "titleNView": false, - "bounce": "none" - } - } }, - { - "path": "pages/tabBar/dir/index", - "style": { - "navigationBarTitleText": "%navigate.menuDir%", - "app-plus": { - "titleNView": { - "type": "transparent", - "titleColor": "#fff", - "backgroundColor": "#0faeff", - "buttons": [], - "searchInput": { - "backgroundColor": "#fff", - "borderRadius": "6px", - "placeholder": "%searchPlaceholder%", - "disabled": true - } - } - }, - "enablePullDownRefresh": true - } - }, - { - "path": "pages/tabBar/dir/search", - "style": { - "navigationBarTitleText": "%navigate.search%", - "app-plus": { - "titleNView": { - "titleColor": "#fff", - "backgroundColor": "#0faeff", - - "searchInput": { - "backgroundColor": "#fff", - "borderRadius": "6px", - "placeholder": "%searchPlaceholder%", - "autoFocus": true - } - } - } + "enablePullDownRefresh": true + } + }, + + { + "path": "pages/tabBar/home/detail", + "style": { + "navigationBarTitleText": "", + "app-plus": { + "titleNView": false, + "bounce": "none" + } + } + }, + { + "path": "pages/tabBar/dir/index", + "style": { + "navigationBarTitleText": "%navigate.menuDir%", + "app-plus": { + "titleNView": { + "type": "transparent", + "titleColor": "#fff", + "backgroundColor": "#0faeff", + "buttons": [], + "searchInput": { + "backgroundColor": "#fff", + "borderRadius": "6px", + "placeholder": "%searchPlaceholder%", + "disabled": true } + } }, - { - "path": "pages/tabBar/dir/folder", - "style": { - "navigationBarTitleText": "", - "app-plus": { - "titleNView": { - "type": "transparent" - } - }, - "h5": { - "titleNView": { - "type": "transparent", - "buttons": [] - } - } + "enablePullDownRefresh": true + } + }, + { + "path": "pages/tabBar/dir/search", + "style": { + "navigationBarTitleText": "%navigate.search%", + "app-plus": { + "titleNView": { + "titleColor": "#fff", + "backgroundColor": "#0faeff", + + "searchInput": { + "backgroundColor": "#fff", + "borderRadius": "6px", + "placeholder": "%searchPlaceholder%", + "autoFocus": true } + } + } + } + }, + { + "path": "pages/tabBar/dir/folder", + "style": { + "navigationBarTitleText": "", + "app-plus": { + "titleNView": { + "type": "transparent" + } }, - { - "path": "pages/tabBar/me/index", - "style": { - "navigationBarTitleText": "%navigate.menuMe%", - "app-plus": { - "titleNView": false - } - } - }, - { - "path": "pages/tabBar/me/person", - "style": { - "navigationBarTitleText": "%navigate.personInfo%", - - "app-plus": { - "titleNView": { - "type": "transparent" - } - } - } - }, - { - "path": "pages/tabBar/me/language", - "style": { - "navigationBarTitleText": "%navigate.language%", - - "app-plus": { - "titleNView": { - "type": "transparent" - } - } - } - }, - { - "path": "pages/tabBar/me/about", - "style": { - "navigationBarTitleText": "%navigate.about%", - - "app-plus": { - "titleNView": { - "type": "transparent" - } - } - } - }, - { - "path": "pages/tabBar/me/outlink", - "style": { - "navigationBarTitleText": "", - - "app-plus": { - "titleNView": { - "type": "transparent" - } - } - } - }, - { - "path": "pages/index/index", - "style": { - "navigationBarTitleText": "%app.name%", - "h5": { - "maxWidth": 1190, - "navigationBarTextStyle": "black", - "navigationBarBackgroundColor": "#F1F1F1" - } - } - } - ], - "globalStyle": { - "navigationBarTextStyle": "black", - "navigationBarTitleText": "%app.name%", - "navigationBarBackgroundColor": "#ffffff", - "backgroundColor": "#ffffff" - }, - "tabBar": { - "color": "#7A7E83", - "selectedColor": "#007AFF", - "borderStyle": "black", - "backgroundColor": "#ffffff", - - "list": [{ - "pagePath": "pages/tabBar/home/index", - "iconPath": "static/home.png", - "selectedIconPath": "static/home_select.png", - "text": "%navigate.menuHome%" - }, - { - "pagePath": "pages/tabBar/dir/index", - "iconPath": "static/dir.png", - "selectedIconPath": "static/dir_select.png", - "text": "%navigate.menuDir%" - }, { - "pagePath": "pages/tabBar/me/index", - "iconPath": "static/me.png", - "selectedIconPath": "static/me_select.png", - "text": "%navigate.menuMe%" - } - ] - } -} + "h5": { + "titleNView": { + "type": "transparent", + "buttons": [] + } + } + } + }, + { + "path": "pages/tabBar/me/index", + "style": { + "navigationBarTitleText": "%navigate.menuMe%", + "app-plus": { + "titleNView": false + } + } + }, + { + "path": "pages/tabBar/me/person", + "style": { + "navigationBarTitleText": "%navigate.personInfo%", + + "app-plus": { + "titleNView": { + "type": "transparent" + } + } + } + }, + { + "path": "pages/tabBar/me/language", + "style": { + "navigationBarTitleText": "%navigate.language%", + + "app-plus": { + "titleNView": { + "type": "transparent" + } + } + } + }, + { + "path": "pages/tabBar/me/about", + "style": { + "navigationBarTitleText": "%navigate.about%", + + "app-plus": { + "titleNView": { + "type": "transparent" + } + } + } + }, + { + "path": "pages/tabBar/me/outlink", + "style": { + "navigationBarTitleText": "", + + "app-plus": { + "titleNView": { + "type": "transparent" + } + } + } + }, + { + "path": "pages/index/index", + "style": { + "navigationBarTitleText": "%app.name%", + "h5": { + "maxWidth": 1190, + "navigationBarTextStyle": "black", + "navigationBarBackgroundColor": "#F1F1F1" + } + } + } + ], + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "%app.name%", + "navigationBarBackgroundColor": "#ffffff", + "backgroundColor": "#ffffff" + }, + "tabBar": { + "color": "#7A7E83", + "selectedColor": "#007AFF", + "borderStyle": "black", + "backgroundColor": "#ffffff", + + "list": [{ + "pagePath": "pages/tabBar/home/index", + "iconPath": "static/home.png", + "selectedIconPath": "static/home_select.png", + "text": "%navigate.menuHome%" + }, + { + "pagePath": "pages/tabBar/dir/index", + "iconPath": "static/dir.png", + "selectedIconPath": "static/dir_select.png", + "text": "%navigate.menuDir%" + }, { + "pagePath": "pages/tabBar/me/index", + "iconPath": "static/me.png", + "selectedIconPath": "static/me_select.png", + "text": "%navigate.menuMe%" + } + ] + } +} \ No newline at end of file diff --git a/mobile/src/pages/login/index.vue b/mobile/src/pages/login/index.vue index 5b10f91ac3..12b9d94dee 100644 --- a/mobile/src/pages/login/index.vue +++ b/mobile/src/pages/login/index.vue @@ -1,385 +1,404 @@ + .oauth-image image { + width: 30px; + height: 30px; + margin: 10px; + } + + .oauth-image button { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0; + } + + .captcha-view { + line-height: 0; + justify-content: center; + align-items: center; + display: flex; + position: relative; + background-color: #f3f3f3; + } + + .welcome { + padding-left: 15px; + font-size: x-large; + font-weight: 500; + letter-spacing: 2px; + } + \ No newline at end of file From 0e6cb26ba9c9a3aa6647108f95f214da8503ec0b Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Fri, 17 Feb 2023 21:53:57 +0800 Subject: [PATCH 2/4] =?UTF-8?q?perf(token):=20=E7=A6=81=E7=94=A8token?= =?UTF-8?q?=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/auth/filter/JWTFilter.java | 4 +--- .../java/io/dataease/auth/util/JWTUtils.java | 21 +++---------------- .../commons/utils/TokenCacheUtils.java | 9 -------- .../src/main/resources/ehcache/ehcache.xml | 12 +---------- 4 files changed, 5 insertions(+), 41 deletions(-) diff --git a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java index e5bd636789..db9be9a709 100644 --- a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java +++ b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java @@ -66,7 +66,7 @@ public class JWTFilter extends BasicHttpAuthenticationFilter { if (StringUtils.startsWith(authorization, "Basic")) { return false; } - if (!TokenCacheUtils.validate(authorization) && !TokenCacheUtils.validateDelay(authorization)) { + if (!TokenCacheUtils.validate(authorization)) { throw new AuthenticationException(expireMessage); } // 当没有出现登录超时 且需要刷新token 则执行刷新token @@ -75,8 +75,6 @@ public class JWTFilter extends BasicHttpAuthenticationFilter { throw new AuthenticationException(expireMessage); } if (JWTUtils.needRefresh(authorization)) { - TokenCacheUtils.addWithTtl(authorization, 1L); - TokenCacheUtils.remove(authorization); authorization = refreshToken(request, response); } JWTToken token = new JWTToken(authorization); diff --git a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java index cebe34c5f5..2c671abda9 100644 --- a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java +++ b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java @@ -20,9 +20,6 @@ import java.util.Date; public class JWTUtils { - // token过期时间1min (过期会自动刷新续命 目的是避免一直都是同一个token ) - private static final long EXPIRE_TIME = 1 * 60 * 1000; - // 登录间隔时间10min 超过这个时间强制重新登录 private static long Login_Interval; /** @@ -67,9 +64,7 @@ public class JWTUtils { } public static boolean needRefresh(String token) { - Date exp = JWTUtils.getExp(token); - Long advanceTime = 5000L; - return (new Date().getTime() + advanceTime) >= exp.getTime(); + return false; } /** @@ -95,18 +90,9 @@ public class JWTUtils { return isExpire; } - public static Date getExp(String token) { - try { - DecodedJWT jwt = JWT.decode(token); - return jwt.getClaim("exp").asDate(); - } catch (JWTDecodeException e) { - e.printStackTrace(); - return null; - } - } + /** - * 生成签名,5min后过期 * * @param tokenInfo 用户信息 * @param secret 用户的密码 @@ -114,12 +100,11 @@ public class JWTUtils { */ public static String sign(TokenInfo tokenInfo, String secret) { try { - Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); Algorithm algorithm = Algorithm.HMAC256(secret); Builder builder = JWT.create() .withClaim("username", tokenInfo.getUsername()) .withClaim("userId", tokenInfo.getUserId()); - String sign = builder.withExpiresAt(date).sign(algorithm); + String sign = builder.sign(algorithm); TokenCacheUtils.add(sign, tokenInfo.getUserId()); return sign; diff --git a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java index 338adbf2da..bc936c3be5 100644 --- a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java +++ b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java @@ -7,7 +7,6 @@ import org.apache.commons.lang3.StringUtils; public class TokenCacheUtils { private static final String KEY = "sys_token_store"; - private static final String DELAY_KEY = "sys_token_store_delay"; public static void add(String token, Long userId) { CacheUtils.put(KEY, token, userId, null, null); @@ -27,12 +26,4 @@ public class TokenCacheUtils { return ObjectUtils.isNotEmpty(sys_token_store) && StringUtils.isNotBlank(sys_token_store.toString()) && userId == Long.parseLong(sys_token_store.toString()); } - public static void addWithTtl(String token, Long userId) { - CacheUtils.put(DELAY_KEY, token, userId, 3, 5); - } - - public static boolean validateDelay(String token) { - Object tokenObj = CacheUtils.get(DELAY_KEY, token); - return ObjectUtils.isNotEmpty(tokenObj) && StringUtils.isNotBlank(tokenObj.toString()); - } } diff --git a/backend/src/main/resources/ehcache/ehcache.xml b/backend/src/main/resources/ehcache/ehcache.xml index f8d8591b20..eccd3b1661 100644 --- a/backend/src/main/resources/ehcache/ehcache.xml +++ b/backend/src/main/resources/ehcache/ehcache.xml @@ -277,19 +277,9 @@ maxElementsOnDisk="3000" overflowToDisk="true" diskPersistent="false" - /> - - + \ No newline at end of file From a34e99d7c1bab3a1555c67e7ed81eae0d571f466 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Fri, 17 Feb 2023 22:05:00 +0800 Subject: [PATCH 3/4] =?UTF-8?q?Revert=20"perf(token):=20=E7=A6=81=E7=94=A8?= =?UTF-8?q?token=E5=88=B7=E6=96=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 0e6cb26ba9c9a3aa6647108f95f214da8503ec0b. --- .../io/dataease/auth/filter/JWTFilter.java | 4 +++- .../java/io/dataease/auth/util/JWTUtils.java | 21 ++++++++++++++++--- .../commons/utils/TokenCacheUtils.java | 9 ++++++++ .../src/main/resources/ehcache/ehcache.xml | 12 ++++++++++- 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java index db9be9a709..e5bd636789 100644 --- a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java +++ b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java @@ -66,7 +66,7 @@ public class JWTFilter extends BasicHttpAuthenticationFilter { if (StringUtils.startsWith(authorization, "Basic")) { return false; } - if (!TokenCacheUtils.validate(authorization)) { + if (!TokenCacheUtils.validate(authorization) && !TokenCacheUtils.validateDelay(authorization)) { throw new AuthenticationException(expireMessage); } // 当没有出现登录超时 且需要刷新token 则执行刷新token @@ -75,6 +75,8 @@ public class JWTFilter extends BasicHttpAuthenticationFilter { throw new AuthenticationException(expireMessage); } if (JWTUtils.needRefresh(authorization)) { + TokenCacheUtils.addWithTtl(authorization, 1L); + TokenCacheUtils.remove(authorization); authorization = refreshToken(request, response); } JWTToken token = new JWTToken(authorization); diff --git a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java index 2c671abda9..cebe34c5f5 100644 --- a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java +++ b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java @@ -20,6 +20,9 @@ import java.util.Date; public class JWTUtils { + // token过期时间1min (过期会自动刷新续命 目的是避免一直都是同一个token ) + private static final long EXPIRE_TIME = 1 * 60 * 1000; + // 登录间隔时间10min 超过这个时间强制重新登录 private static long Login_Interval; /** @@ -64,7 +67,9 @@ public class JWTUtils { } public static boolean needRefresh(String token) { - return false; + Date exp = JWTUtils.getExp(token); + Long advanceTime = 5000L; + return (new Date().getTime() + advanceTime) >= exp.getTime(); } /** @@ -90,9 +95,18 @@ public class JWTUtils { return isExpire; } - + public static Date getExp(String token) { + try { + DecodedJWT jwt = JWT.decode(token); + return jwt.getClaim("exp").asDate(); + } catch (JWTDecodeException e) { + e.printStackTrace(); + return null; + } + } /** + * 生成签名,5min后过期 * * @param tokenInfo 用户信息 * @param secret 用户的密码 @@ -100,11 +114,12 @@ public class JWTUtils { */ public static String sign(TokenInfo tokenInfo, String secret) { try { + Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); Algorithm algorithm = Algorithm.HMAC256(secret); Builder builder = JWT.create() .withClaim("username", tokenInfo.getUsername()) .withClaim("userId", tokenInfo.getUserId()); - String sign = builder.sign(algorithm); + String sign = builder.withExpiresAt(date).sign(algorithm); TokenCacheUtils.add(sign, tokenInfo.getUserId()); return sign; diff --git a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java index bc936c3be5..338adbf2da 100644 --- a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java +++ b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java @@ -7,6 +7,7 @@ import org.apache.commons.lang3.StringUtils; public class TokenCacheUtils { private static final String KEY = "sys_token_store"; + private static final String DELAY_KEY = "sys_token_store_delay"; public static void add(String token, Long userId) { CacheUtils.put(KEY, token, userId, null, null); @@ -26,4 +27,12 @@ public class TokenCacheUtils { return ObjectUtils.isNotEmpty(sys_token_store) && StringUtils.isNotBlank(sys_token_store.toString()) && userId == Long.parseLong(sys_token_store.toString()); } + public static void addWithTtl(String token, Long userId) { + CacheUtils.put(DELAY_KEY, token, userId, 3, 5); + } + + public static boolean validateDelay(String token) { + Object tokenObj = CacheUtils.get(DELAY_KEY, token); + return ObjectUtils.isNotEmpty(tokenObj) && StringUtils.isNotBlank(tokenObj.toString()); + } } diff --git a/backend/src/main/resources/ehcache/ehcache.xml b/backend/src/main/resources/ehcache/ehcache.xml index eccd3b1661..f8d8591b20 100644 --- a/backend/src/main/resources/ehcache/ehcache.xml +++ b/backend/src/main/resources/ehcache/ehcache.xml @@ -277,9 +277,19 @@ maxElementsOnDisk="3000" overflowToDisk="true" diskPersistent="false" + /> + + - \ No newline at end of file From 13adc3de0bac706b84940699d649169004e1e372 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Mon, 20 Feb 2023 09:15:14 +0800 Subject: [PATCH 4/4] =?UTF-8?q?perf(token):=20token=E9=80=80=E5=87=BA?= =?UTF-8?q?=E5=A4=B1=E6=95=88=E9=87=87=E7=94=A8token=E9=BB=91=E5=90=8D?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/auth/config/F2CRealm.java | 2 +- .../io/dataease/auth/filter/JWTFilter.java | 4 +- .../io/dataease/auth/server/AuthServer.java | 6 +- .../java/io/dataease/auth/util/JWTUtils.java | 2 - .../commons/utils/TokenCacheUtils.java | 72 ++++++++++++++----- 5 files changed, 61 insertions(+), 25 deletions(-) diff --git a/backend/src/main/java/io/dataease/auth/config/F2CRealm.java b/backend/src/main/java/io/dataease/auth/config/F2CRealm.java index 2084145759..504d8cfb6f 100644 --- a/backend/src/main/java/io/dataease/auth/config/F2CRealm.java +++ b/backend/src/main/java/io/dataease/auth/config/F2CRealm.java @@ -84,7 +84,7 @@ public class F2CRealm extends AuthorizingRealm { token = (String) auth.getCredentials(); // 解密获得username,用于和数据库进行对比 tokenInfo = JWTUtils.tokenInfoByToken(token); - if (!TokenCacheUtils.validate(token)) { + if (TokenCacheUtils.invalid(token)) { throw new AuthenticationException("token invalid"); } } catch (Exception e) { diff --git a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java index e5bd636789..0d70181289 100644 --- a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java +++ b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java @@ -66,7 +66,7 @@ public class JWTFilter extends BasicHttpAuthenticationFilter { if (StringUtils.startsWith(authorization, "Basic")) { return false; } - if (!TokenCacheUtils.validate(authorization) && !TokenCacheUtils.validateDelay(authorization)) { + if (TokenCacheUtils.invalid(authorization)) { throw new AuthenticationException(expireMessage); } // 当没有出现登录超时 且需要刷新token 则执行刷新token @@ -75,8 +75,6 @@ public class JWTFilter extends BasicHttpAuthenticationFilter { throw new AuthenticationException(expireMessage); } if (JWTUtils.needRefresh(authorization)) { - TokenCacheUtils.addWithTtl(authorization, 1L); - TokenCacheUtils.remove(authorization); authorization = refreshToken(request, response); } JWTToken token = new JWTToken(authorization); diff --git a/backend/src/main/java/io/dataease/auth/server/AuthServer.java b/backend/src/main/java/io/dataease/auth/server/AuthServer.java index 6e1fdafd57..ed7cdb0328 100644 --- a/backend/src/main/java/io/dataease/auth/server/AuthServer.java +++ b/backend/src/main/java/io/dataease/auth/server/AuthServer.java @@ -148,7 +148,7 @@ public class AuthServer implements AuthApi { AccountLockStatus lockStatus = authUserService.recordLoginFail(username, 0); DataEaseException.throwException(appendLoginErrorMsg(Translator.get("i18n_id_or_pwd_error"), lockStatus)); } - if(user.getIsAdmin() && user.getPassword().equals("40b8893ea9ebc2d631c4bb42bb1e8996")){ + if (user.getIsAdmin() && user.getPassword().equals("40b8893ea9ebc2d631c4bb42bb1e8996")) { result.put("passwordModified", false); } } @@ -237,7 +237,7 @@ public class AuthServer implements AuthApi { if (StringUtils.isBlank(result)) { result = "success"; } - TokenCacheUtils.remove(token); + TokenCacheUtils.add(token, userId); } catch (Exception e) { LogUtil.error(e); if (StringUtils.isBlank(result)) { @@ -291,7 +291,7 @@ public class AuthServer implements AuthApi { if (StringUtils.isBlank(result)) { result = "success"; } - TokenCacheUtils.remove(token); + TokenCacheUtils.add(token, userId); } catch (Exception e) { LogUtil.error(e); if (StringUtils.isBlank(result)) { diff --git a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java index cebe34c5f5..fc297d1e17 100644 --- a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java +++ b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java @@ -10,7 +10,6 @@ import com.auth0.jwt.interfaces.Verification; import io.dataease.auth.entity.TokenInfo; import io.dataease.auth.entity.TokenInfo.TokenInfoBuilder; import io.dataease.commons.utils.CommonBeanFactory; -import io.dataease.commons.utils.TokenCacheUtils; import io.dataease.exception.DataEaseException; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -120,7 +119,6 @@ public class JWTUtils { .withClaim("username", tokenInfo.getUsername()) .withClaim("userId", tokenInfo.getUserId()); String sign = builder.withExpiresAt(date).sign(algorithm); - TokenCacheUtils.add(sign, tokenInfo.getUserId()); return sign; } catch (Exception e) { diff --git a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java index 338adbf2da..0bcec3b8c8 100644 --- a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java +++ b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java @@ -3,36 +3,76 @@ package io.dataease.commons.utils; import io.dataease.listener.util.CacheUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; +import java.util.concurrent.TimeUnit; + + +@Component public class TokenCacheUtils { + private static final String KEY = "sys_token_store"; - private static final String DELAY_KEY = "sys_token_store_delay"; + + private static String cacheType; + + private static Long expTime; + + @Value("${spring.cache.type:ehcache}") + public void setCacheType(String cacheType) { + TokenCacheUtils.cacheType = cacheType; + } + + @Value("${dataease.login_timeout:480}") + public void setExpTime(Long expTime) { + TokenCacheUtils.expTime = expTime; + } + + private static boolean useRedis() { + return StringUtils.equals(cacheType, "redis"); + } + + + private static ValueOperations cacheHandler() { + RedisTemplate redisTemplate = (RedisTemplate) CommonBeanFactory.getBean("redisTemplate"); + ValueOperations valueOperations = redisTemplate.opsForValue(); + return valueOperations; + } public static void add(String token, Long userId) { - CacheUtils.put(KEY, token, userId, null, null); + if (useRedis()) { + ValueOperations valueOperations = cacheHandler(); + valueOperations.set(KEY + token, userId, expTime, TimeUnit.MINUTES); + return; + } + + Long time = expTime * 60; + CacheUtils.put(KEY, token, userId, time.intValue(), null); + } public static void remove(String token) { + if (useRedis()) { + RedisTemplate redisTemplate = (RedisTemplate) CommonBeanFactory.getBean("redisTemplate"); + String key = KEY + token; + if (redisTemplate.hasKey(key)) { + redisTemplate.delete(key); + } + return; + } CacheUtils.remove(KEY, token); } - public static boolean validate(String token) { + public static boolean invalid(String token) { + if (useRedis()) { + RedisTemplate redisTemplate = (RedisTemplate) CommonBeanFactory.getBean("redisTemplate"); + return redisTemplate.hasKey(KEY + token); + } Object sys_token_store = CacheUtils.get(KEY, token); return ObjectUtils.isNotEmpty(sys_token_store) && StringUtils.isNotBlank(sys_token_store.toString()); } - public static boolean validate(String token, Long userId) { - Object sys_token_store = CacheUtils.get(KEY, token); - return ObjectUtils.isNotEmpty(sys_token_store) && StringUtils.isNotBlank(sys_token_store.toString()) && userId == Long.parseLong(sys_token_store.toString()); - } - - public static void addWithTtl(String token, Long userId) { - CacheUtils.put(DELAY_KEY, token, userId, 3, 5); - } - - public static boolean validateDelay(String token) { - Object tokenObj = CacheUtils.get(DELAY_KEY, token); - return ObjectUtils.isNotEmpty(tokenObj) && StringUtils.isNotBlank(tokenObj.toString()); - } }