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 6d0aaef239..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;
@@ -68,7 +67,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();
}
/**
@@ -119,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());
- }
}
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 @@
-
-
-
-
- {{$t('login.title')}}
-
-
- {{$t('login.account')}}
-
-
-
- {{$t('login.password')}}
-
-
-
-
-
-
-
-
-
+
+
+
+
+ {{$t('login.title')}}
+
+
+ {{$t('login.account')}}
+
+
+
+ {{$t('login.password')}}
+
+
+
+
+
+
+
+
+
+
+ .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