Browse Source

根据自身场景简化下

yufeng0528 4 years ago
parent
commit
9f3e7fbb3a

+ 4 - 0
spring5-auth/spring5-auth-server/README.md

@@ -3,6 +3,10 @@
3 3
 ## github 认证
4 4
 1. [https://www.baeldung.com/spring-oauth-login-webflux](https://www.baeldung.com/spring-oauth-login-webflux)
5 5
 
6
+## 场景
7
+1. 用户登录,登录时长为30天,不用考虑刷新情况
8
+2. 管理员登录,登录时长在一小时左右,需要考虑刷新
9
+3. 不需要考虑登出情况
6 10
 
7 11
 
8 12
 

+ 4 - 1
spring5-auth/spring5-auth-server/src/main/java/com/yaozhitech/spring5/config/ShiroConfiguration.java

@@ -32,6 +32,9 @@ public class ShiroConfiguration {
32 32
 	
33 33
 	@Value("${password.salt}")
34 34
 	private String encryptSalt;
35
+	
36
+	@Value("${jwt.salt}")
37
+	private String jwtSalt;
35 38
 
36 39
 	/**
37 40
 	 * 注册shiro的Filter,拦截请求
@@ -82,7 +85,7 @@ public class ShiroConfiguration {
82 85
      */
83 86
     @Bean("jwtRealm")
84 87
     public Realm jwtShiroRealm(UserService userService) {
85
-        JWTShiroRealm myShiroRealm = new JWTShiroRealm(userService);
88
+        JWTShiroRealm myShiroRealm = new JWTShiroRealm(userService, jwtSalt);
86 89
         return myShiroRealm;
87 90
     }
88 91
 

+ 0 - 2
spring5-auth/spring5-auth-server/src/main/java/com/yaozhitech/spring5/controller/LoginController.java

@@ -63,8 +63,6 @@ public class LoginController {
63 63
 	public Mono<String> logout() {
64 64
 		Subject subject = SecurityUtils.getSubject();
65 65
 		if (subject.getPrincipals() != null) {
66
-			UserDto user = (UserDto) subject.getPrincipals().getPrimaryPrincipal();
67
-			userService.deleteLoginInfo(user.getUsername());
68 66
 		}
69 67
 		SecurityUtils.getSubject().logout();
70 68
 		return Mono.empty();

+ 10 - 3
spring5-auth/spring5-auth-server/src/main/java/com/yaozhitech/spring5/filter/JwtAuthFilter.java

@@ -76,9 +76,16 @@ public class JwtAuthFilter extends AuthenticatingFilter {
76 76
     @Override
77 77
     protected AuthenticationToken createToken(ServletRequest servletRequest, ServletResponse servletResponse) {
78 78
         String jwtToken = getAuthzHeader(servletRequest);
79
-        if(!StringUtils.isEmpty(jwtToken)&&!JwtUtils.isTokenExpired(jwtToken))
80
-            return new JWTToken(jwtToken);
81
-
79
+        
80
+        if (!StringUtils.isEmpty(jwtToken)) {
81
+			if (JwtUtils.isTokenExpired(jwtToken)) {
82
+				log.error(jwtToken + " 已过期");
83
+				return null;
84
+			}
85
+			
86
+			return new JWTToken(jwtToken);
87
+		}
88
+        
82 89
         return null;
83 90
     }
84 91
 

+ 5 - 2
spring5-auth/spring5-auth-server/src/main/java/com/yaozhitech/spring5/jwt/JWTShiroRealm.java

@@ -22,10 +22,13 @@ import com.yaozhitech.spring5.utils.JwtUtils;
22 22
 public class JWTShiroRealm extends AuthorizingRealm {
23 23
 
24 24
     protected UserService userService;
25
+    
26
+    private String jwtSalt;
25 27
 
26
-    public JWTShiroRealm(UserService userService){
28
+    public JWTShiroRealm(UserService userService, String jwtSalt){
27 29
         this.userService = userService;
28 30
         this.setCredentialsMatcher(new JWTCredentialsMatcher());
31
+        this.jwtSalt = jwtSalt;
29 32
     }
30 33
 
31 34
     @Override
@@ -42,7 +45,7 @@ public class JWTShiroRealm extends AuthorizingRealm {
42 45
         JWTToken jwtToken = (JWTToken) authcToken;
43 46
         String token = jwtToken.getToken();
44 47
         
45
-        UserDto user = userService.getJwtTokenInfo(JwtUtils.getUsername(token));
48
+        UserDto user = userService.getJwtTokenInfo(JwtUtils.verifyTokenAndGet(token, jwtSalt));
46 49
         if(user == null)
47 50
             throw new AuthenticationException("token过期,请重新登录");
48 51
 

+ 6 - 22
spring5-auth/spring5-auth-server/src/main/java/com/yaozhitech/spring5/service/UserService.java

@@ -1,13 +1,10 @@
1 1
 package com.yaozhitech.spring5.service;
2 2
 
3
-import java.time.Duration;
4 3
 import java.util.Arrays;
5 4
 import java.util.List;
6 5
 
7 6
 import org.apache.shiro.crypto.hash.Sha256Hash;
8
-import org.springframework.beans.factory.annotation.Autowired;
9 7
 import org.springframework.beans.factory.annotation.Value;
10
-import org.springframework.data.redis.core.StringRedisTemplate;
11 8
 import org.springframework.stereotype.Service;
12 9
 
13 10
 import com.yaozhitech.spring5.dto.UserDto;
@@ -18,9 +15,9 @@ public class UserService {
18 15
 
19 16
 	@Value("${password.salt}")
20 17
 	private String encryptSalt;
21
-
22
-	@Autowired
23
-	private StringRedisTemplate redisTemplate;
18
+	
19
+	@Value("${jwt.salt}")
20
+	private String jwtSalt;
24 21
 
25 22
 	/**
26 23
 	 * 保存user登录信息,返回token
@@ -28,9 +25,7 @@ public class UserService {
28 25
 	 * @param userDto
29 26
 	 */
30 27
 	public String generateJwtToken(String username) {
31
-		String salt = JwtUtils.generateSalt();
32
-		redisTemplate.opsForValue().set("token:"+username, salt, Duration.ofSeconds(3600));
33
-		return JwtUtils.sign(username, salt, 3600); // 生成jwt token,设置过期时间为1小时
28
+		return JwtUtils.sign(username, jwtSalt, 3600); // 生成jwt token,设置过期时间为1小时
34 29
 	}
35 30
 
36 31
 	/**
@@ -40,23 +35,12 @@ public class UserService {
40 35
 	 * @return
41 36
 	 */
42 37
 	public UserDto getJwtTokenInfo(String username) {
43
-		String salt = redisTemplate.opsForValue().get("token:"+username);
44 38
 		UserDto user = getUserInfo(username);
45
-		user.setSalt(salt);
39
+		user.setSalt(jwtSalt);
46 40
 		return user;
47 41
 	}
48 42
 
49 43
 	/**
50
-	 * 清除token信息
51
-	 * 
52
-	 * @param userName 登录用户名
53
-	 * @param terminal 登录终端
54
-	 */
55
-	public void deleteLoginInfo(String username) {
56
-		redisTemplate.delete("token:"+username);
57
-	}
58
-
59
-	/**
60 44
 	 * 获取数据库中保存的用户信息,主要是加密后的密码
61 45
 	 * 
62 46
 	 * @param userName
@@ -65,7 +49,7 @@ public class UserService {
65 49
 	public UserDto getUserInfo(String userName) {
66 50
 		UserDto user = new UserDto();
67 51
 		user.setUserId(1L);
68
-		user.setUsername("admin");
52
+		user.setUsername(userName);
69 53
 		user.setEncryptPwd(new Sha256Hash("123456", encryptSalt).toHex());
70 54
 		return user;
71 55
 	}

+ 26 - 11
spring5-auth/spring5-auth-server/src/main/java/com/yaozhitech/spring5/utils/JwtUtils.java

@@ -4,13 +4,15 @@ import java.io.UnsupportedEncodingException;
4 4
 import java.util.Calendar;
5 5
 import java.util.Date;
6 6
 
7
-import org.apache.shiro.crypto.SecureRandomNumberGenerator;
8
-
9 7
 import com.auth0.jwt.JWT;
8
+import com.auth0.jwt.JWTVerifier;
10 9
 import com.auth0.jwt.algorithms.Algorithm;
11 10
 import com.auth0.jwt.exceptions.JWTDecodeException;
12 11
 import com.auth0.jwt.interfaces.DecodedJWT;
13 12
 
13
+import lombok.extern.slf4j.Slf4j;
14
+
15
+@Slf4j
14 16
 public class JwtUtils {
15 17
 
16 18
 	/**
@@ -38,6 +40,19 @@ public class JwtUtils {
38 40
             return null;
39 41
         }
40 42
     }
43
+    
44
+    public static String verifyTokenAndGet(String token, String secret) {
45
+        DecodedJWT jwt = null;
46
+        try {
47
+            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret)).build();
48
+            jwt = verifier.verify(token);
49
+            
50
+        } catch (Exception e) {
51
+        	log.error(e.getMessage(), e);
52
+            return null;
53
+        }
54
+        return jwt.getClaim("username").asString();
55
+    }
41 56
 
42 57
     /**
43 58
      * 生成签名,expireTime后过期
@@ -70,13 +85,13 @@ public class JwtUtils {
70 85
         return jwt.getExpiresAt().before(now);
71 86
     }
72 87
 
73
-    /**
74
-     * 生成随机盐,长度32位
75
-     * @return
76
-     */
77
-    public static String generateSalt(){
78
-        SecureRandomNumberGenerator secureRandom = new SecureRandomNumberGenerator();
79
-        String hex = secureRandom.nextBytes(16).toHex();
80
-        return hex;
81
-    }
88
+//    /**
89
+//     * 生成随机盐,长度32位
90
+//     * @return
91
+//     */
92
+//    public static String generateSalt(){
93
+//        SecureRandomNumberGenerator secureRandom = new SecureRandomNumberGenerator();
94
+//        String hex = secureRandom.nextBytes(16).toHex();
95
+//        return hex;
96
+//    }
82 97
 }

+ 3 - 1
spring5-auth/spring5-auth-server/src/main/resources/application.yml

@@ -20,5 +20,7 @@ spring:
20 20
     password: huojutech!23
21 21
   
22 22
 password:
23
-  salt: k12829WhsvnEV$#03b2n          
23
+  salt: k12829WhsvnEV$#03b2n
24
+jwt:
25
+  salt: xP3La8IhZjl4fmWXD.AYVH5tor5bn-Rr
24 26
   

+ 5 - 1
spring5-order/src/main/java/com/yaozhitech/spring5/controller/OrderController.java

@@ -43,7 +43,11 @@ public class OrderController {
43 43
 		
44 44
 		log.info(token);
45 45
 		
46
-		token = JwtUtils.sign("mock" + "." + "TQo0s7$NrpN6yEA#", JwtUtils.generateSalt(), 3600);
46
+		token = JwtUtils.sign("mock" + "." + "TQo0s7$NrpN6yEA#", "abc", 3600);
47
+		log.info(token);
48
+		
49
+		token = JwtUtils.sign("mock" + "." + "TQo0s7$NrpN6yEA#", "abc", 2600);
50
+		log.info(token);
47 51
 		
48 52
 		return ResponseEntity.ok(token);
49 53
 	}