From 7f743e7dfb9f26dd6e679cd7bac3940cedbc746c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=82=B1=E9=A3=9E=E4=BA=91?= <1941783199@qq.com>
Date: Tue, 29 Sep 2020 11:47:38 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=99=BB=E5=BD=95=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3=EF=BC=8C=E4=BC=98=E5=8C=96token=EF=BC=8C=E6=96=B0?=
=?UTF-8?q?=E5=A2=9E=E7=99=BB=E5=BD=95=E6=97=A5=E5=BF=97=EF=BC=8C=E5=A4=84?=
=?UTF-8?q?=E7=90=86redis=E8=BF=9E=E6=8E=A5=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
dq-financial-hrms-auth/pom.xml | 35 +++----
.../financial/hrauth/dao/LoginLogMapper.java | 9 ++
.../financial/hrauth/dao/TokenMapper.java | 9 ++
.../hrauth/service/LoginLogService.java | 7 ++
.../hrauth/service/TokenService.java | 7 ++
.../service/impl/LoginLogServiceImpl.java | 11 +++
.../hrauth/service/impl/TokenServiceImpl.java | 11 +++
.../service/impl/UserLoginServiceImpl.java | 57 +++++++++--
.../daqing/financial/hrauth/util/JwtUtil.java | 71 --------------
.../src/main/resources/bootstrap.properties | 10 ++
.../hrms/config/ResourceServerConfig.java | 94 +++++++++---------
dq-framework-common/pom.xml | 49 +++++-----
.../framework}/SpringContextHolder.java | 2 +-
.../com/daqing/framework/util/JwtUtils.java | 97 +++++++++++++++++++
.../com/daqing/framework}/util/RedisUtil.java | 11 ++-
.../framework/domain/hrms/LoginLog.java | 28 ++++++
.../daqing/framework/domain/hrms/Token.java | 18 ++++
dq-framework-utils/pom.xml | 29 +-----
dq-govern-gateway/pom.xml | 17 ++--
.../gateway/config/ApiGlobalFilter.java | 19 ++--
20 files changed, 375 insertions(+), 216 deletions(-)
create mode 100644 dq-financial-hrms-auth/src/main/java/com/daqing/financial/hrauth/dao/LoginLogMapper.java
create mode 100644 dq-financial-hrms-auth/src/main/java/com/daqing/financial/hrauth/dao/TokenMapper.java
create mode 100644 dq-financial-hrms-auth/src/main/java/com/daqing/financial/hrauth/service/LoginLogService.java
create mode 100644 dq-financial-hrms-auth/src/main/java/com/daqing/financial/hrauth/service/TokenService.java
create mode 100644 dq-financial-hrms-auth/src/main/java/com/daqing/financial/hrauth/service/impl/LoginLogServiceImpl.java
create mode 100644 dq-financial-hrms-auth/src/main/java/com/daqing/financial/hrauth/service/impl/TokenServiceImpl.java
delete mode 100644 dq-financial-hrms-auth/src/main/java/com/daqing/financial/hrauth/util/JwtUtil.java
rename {dq-financial-hrms-auth/src/main/java/com/daqing/financial/hrauth => dq-framework-common/src/main/java/com/daqing/framework}/SpringContextHolder.java (97%)
create mode 100644 dq-framework-common/src/main/java/com/daqing/framework/util/JwtUtils.java
rename {dq-financial-hrms-auth/src/main/java/com/daqing/financial/hrauth => dq-framework-common/src/main/java/com/daqing/framework}/util/RedisUtil.java (95%)
create mode 100644 dq-framework-model/src/main/java/com/daqing/framework/domain/hrms/LoginLog.java
create mode 100644 dq-framework-model/src/main/java/com/daqing/framework/domain/hrms/Token.java
diff --git a/dq-financial-hrms-auth/pom.xml b/dq-financial-hrms-auth/pom.xml
index 51f3e298..c993f85e 100644
--- a/dq-financial-hrms-auth/pom.xml
+++ b/dq-financial-hrms-auth/pom.xml
@@ -25,43 +25,32 @@
dq-framework-common
1.0-SNAPSHOT
-->
+
+ com.auth0
+ java-jwt
+ 3.2.0
+
+
+ io.jsonwebtoken
+ jjwt
+ 0.7.0
+
com.daqing.framework
dq-framework-model
1.0-SNAPSHOT
-
- org.springframework.boot
- spring-boot-starter-data-redis
-
-
-
+
org.springframework.cloud
spring-cloud-starter-openfeign
-
-
+
@@ -51,17 +40,24 @@
mybatis-plus-generator
3.0.7.1
-
+
org.projectlombok
lombok
1.18.12
+
+ commons-lang
+ commons-lang
+ 2.6
+
+
+ org.apache.commons
+ commons-lang3
+ 3.8.1
+
+
io.springfox
@@ -75,16 +71,14 @@
- org.springframework.boot
- spring-boot-starter-web
- 2.1.8.RELEASE
-
+ com.auth0
+ java-jwt
+ 3.2.0
+
+
+ io.jsonwebtoken
+ jjwt
+ 0.7.0
@@ -99,6 +93,7 @@
5.2.8.RELEASE
+
com.google.guava
guava
diff --git a/dq-financial-hrms-auth/src/main/java/com/daqing/financial/hrauth/SpringContextHolder.java b/dq-framework-common/src/main/java/com/daqing/framework/SpringContextHolder.java
similarity index 97%
rename from dq-financial-hrms-auth/src/main/java/com/daqing/financial/hrauth/SpringContextHolder.java
rename to dq-framework-common/src/main/java/com/daqing/framework/SpringContextHolder.java
index 77a606a0..fdbd0e29 100644
--- a/dq-financial-hrms-auth/src/main/java/com/daqing/financial/hrauth/SpringContextHolder.java
+++ b/dq-framework-common/src/main/java/com/daqing/framework/SpringContextHolder.java
@@ -1,4 +1,4 @@
-package com.daqing.financial.hrauth;
+package com.daqing.framework;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
diff --git a/dq-framework-common/src/main/java/com/daqing/framework/util/JwtUtils.java b/dq-framework-common/src/main/java/com/daqing/framework/util/JwtUtils.java
new file mode 100644
index 00000000..e6eeda6f
--- /dev/null
+++ b/dq-framework-common/src/main/java/com/daqing/framework/util/JwtUtils.java
@@ -0,0 +1,97 @@
+package com.daqing.framework.util;
+
+
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.ExpiredJwtException;
+import io.jsonwebtoken.JwtBuilder;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import org.bouncycastle.util.encoders.Base64;
+
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.SignatureException;
+import java.util.Date;
+
+public class JwtUtils {
+ /**
+ * 签发JWT
+ *
+ * @param id
+ * @param subject 可以是JSON数据 尽可能少
+ * @param ttlMillis
+ * @return String
+ *
+ */
+ public static String createJWT(Long id, String subject, long ttlMillis) {
+ SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
+ long nowMillis = System.currentTimeMillis();
+ Date now = new Date(nowMillis);
+ SecretKey secretKey = generalKey();
+ JwtBuilder builder = Jwts.builder().setId(String.valueOf(id)).setSubject(subject) // 主题
+ .setIssuer("user") // 签发者
+ .setIssuedAt(now) // 签发时间
+ .signWith(signatureAlgorithm, secretKey); // 签名算法以及密匙
+ if (ttlMillis >= 0) {
+ long expMillis = nowMillis + ttlMillis;
+ Date expDate = new Date(expMillis);
+ builder.setExpiration(expDate); // 过期时间
+ }
+ return builder.compact();
+ }
+
+ public static void main(String[] args) {
+ //System.out.printf(createJWT("1","111", 10000000));
+ boolean isTrue = validateJWT("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxIiwic3ViIjoiMTExIiwiaXNzIjoidXNlciIsImlhdCI6MTYwMTM0MzYyNywiZXhwIjoxNjAxMzUzNjI3fQ.q5Ssg2LM1OzzgvVWqLhgP_Hko0-pfeNO5bvpUE5KQ-s");
+ System.out.println(isTrue);
+ }
+
+ /**
+ * 验证JWT
+ *
+ * @param jwtStr
+ * @return
+ */
+ public static Boolean validateJWT(String jwtStr) {
+ //boolean isValidate = false;
+ Claims claims = null;
+ try {
+ claims = parseJWT(jwtStr);
+ return true;
+ } catch (ExpiredJwtException e) {
+ return false;
+ } catch (SignatureException e) {
+ return false;
+ } catch (Exception e) {
+ return false;
+ }
+ //return checkResult;
+ }
+
+ public static SecretKey generalKey() {
+ byte[] encodedKey = Base64.decode("JWTDQ123456");
+ SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
+ return key;
+ }
+
+ /**
+ *
+ * 解析JWT字符串
+ *
+ * @param jwt
+ * @return
+ * @throws Exception
+ */
+ public static Claims parseJWT(String jwt) throws Exception {
+ SecretKey secretKey = generalKey();
+ return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();
+ }
+
+ public static void putTokenToRedis(Long userId, String token, long times) {
+ RedisUtil.setEx("dq:token:"+token, String.valueOf(userId), times);
+ }
+
+ public static void removeTokenByToken(String token) {
+ RedisUtil.del("dq:token:"+token);
+ }
+}
\ No newline at end of file
diff --git a/dq-financial-hrms-auth/src/main/java/com/daqing/financial/hrauth/util/RedisUtil.java b/dq-framework-common/src/main/java/com/daqing/framework/util/RedisUtil.java
similarity index 95%
rename from dq-financial-hrms-auth/src/main/java/com/daqing/financial/hrauth/util/RedisUtil.java
rename to dq-framework-common/src/main/java/com/daqing/framework/util/RedisUtil.java
index de1bf1a8..0da8d44e 100644
--- a/dq-financial-hrms-auth/src/main/java/com/daqing/financial/hrauth/util/RedisUtil.java
+++ b/dq-framework-common/src/main/java/com/daqing/framework/util/RedisUtil.java
@@ -1,7 +1,7 @@
-package com.daqing.financial.hrauth.util;
+package com.daqing.framework.util;
-import com.daqing.financial.hrauth.SpringContextHolder;
+import com.daqing.framework.SpringContextHolder;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
@@ -19,6 +19,13 @@ public class RedisUtil {
private final static StringRedisTemplate stringRedisTemplate = SpringContextHolder.getBean("stringRedisTemplate");
+ /*static private RedisTemplate stringRedisTemplate;
+ static private RedisTemplate getRedisTemplate() {
+ if (stringRedisTemplate == null) {
+ stringRedisTemplate = SpringContextHolder.getBean("redisTemplate");
+ }
+ return stringRedisTemplate;
+ }*/
/**
* 匹配key
*/
diff --git a/dq-framework-model/src/main/java/com/daqing/framework/domain/hrms/LoginLog.java b/dq-framework-model/src/main/java/com/daqing/framework/domain/hrms/LoginLog.java
new file mode 100644
index 00000000..776335b5
--- /dev/null
+++ b/dq-framework-model/src/main/java/com/daqing/framework/domain/hrms/LoginLog.java
@@ -0,0 +1,28 @@
+package com.daqing.framework.domain.hrms;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@TableName("hrms_login_log")
+public class LoginLog {
+
+ @TableId(type = IdType.AUTO)
+ private int id;
+
+ //用户id
+ private Long userId;
+
+ //登录次数
+ private int loginNum;
+
+ //创建时间
+ private Date createTime;
+
+ //最新登录时间
+ private Date newestTime;
+}
diff --git a/dq-framework-model/src/main/java/com/daqing/framework/domain/hrms/Token.java b/dq-framework-model/src/main/java/com/daqing/framework/domain/hrms/Token.java
new file mode 100644
index 00000000..9a5713fb
--- /dev/null
+++ b/dq-framework-model/src/main/java/com/daqing/framework/domain/hrms/Token.java
@@ -0,0 +1,18 @@
+package com.daqing.framework.domain.hrms;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@TableName("hrms_token")
+public class Token {
+
+ @TableId(type = IdType.INPUT)
+ private Long userId;
+ private String token;
+ private Date createTime;
+}
diff --git a/dq-framework-utils/pom.xml b/dq-framework-utils/pom.xml
index 1f394dfc..3eb91834 100644
--- a/dq-framework-utils/pom.xml
+++ b/dq-framework-utils/pom.xml
@@ -25,18 +25,6 @@
-
@@ -44,6 +32,11 @@
dq-framework-common
1.0-SNAPSHOT
+
+ org.springframework.boot
+ spring-boot-starter-web
+ 2.1.8.RELEASE
+
com.aliyun.oss
aliyun-sdk-oss
@@ -66,17 +59,5 @@
5.1.9.RELEASE
compile
-
\ No newline at end of file
diff --git a/dq-govern-gateway/pom.xml b/dq-govern-gateway/pom.xml
index 1cbbb367..4218219e 100644
--- a/dq-govern-gateway/pom.xml
+++ b/dq-govern-gateway/pom.xml
@@ -21,11 +21,16 @@
+
+ com.daqing.framework
+ dq-framework-common
+ 1.0-SNAPSHOT
+
org.springframework.cloud
spring-cloud-starter-gateway
-
+
-
+
+
diff --git a/dq-govern-gateway/src/main/java/com/daqing/financial/gateway/config/ApiGlobalFilter.java b/dq-govern-gateway/src/main/java/com/daqing/financial/gateway/config/ApiGlobalFilter.java
index 53ad45d0..1c03c1da 100644
--- a/dq-govern-gateway/src/main/java/com/daqing/financial/gateway/config/ApiGlobalFilter.java
+++ b/dq-govern-gateway/src/main/java/com/daqing/financial/gateway/config/ApiGlobalFilter.java
@@ -1,7 +1,8 @@
package com.daqing.financial.gateway.config;
import com.alibaba.fastjson.JSONObject;
-import com.daqing.financial.gateway.util.RedisUtil;
+import com.daqing.framework.util.JwtUtils;
+import com.daqing.framework.util.RedisUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
@@ -57,9 +58,9 @@ public class ApiGlobalFilter implements GlobalFilter, Ordered {
//有数据
}else {
//校验token
- //Long userId = verifyJWT(token);
- String userId = RedisUtil.get("dq:token:"+token);
- if (userId == null || "".equals(userId)){
+ boolean isVerify = verifyJWT(token);
+ //String userId = RedisUtil.get("dq:token:"+token);
+ if (! isVerify){
JSONObject message = new JSONObject();
message.put("message", "登录已失效,请重新登录");
message.put("code", "401");
@@ -70,7 +71,7 @@ public class ApiGlobalFilter implements GlobalFilter, Ordered {
return response.writeWith(Mono.just(buffer));
}
//将现在的request,添加当前身份
- ServerHttpRequest mutableReq = exchange.getRequest().mutate().header("Authorization-UserId", userId).build();
+ ServerHttpRequest mutableReq = exchange.getRequest().mutate().header("Authorization", token).build();
ServerWebExchange mutableExchange = exchange.mutate().request(mutableReq).build();
return chain.filter(mutableExchange);
}
@@ -83,9 +84,13 @@ public class ApiGlobalFilter implements GlobalFilter, Ordered {
* @param token
* @return userPhone
*/
- private Long verifyJWT(String token){
+ private Boolean verifyJWT(String token){
String id = RedisUtil.get("dq:token:"+token);
- return Long.parseLong(id);
+ if(id == null || "".equals(id)){
+ return false;
+ }
+ return JwtUtils.validateJWT(token);
+ //return Long.parseLong(id);
}
@Override