Parcourir la source

根据自身场景简化下

yufeng0528 il y a 4 ans
Parent
commit
9f3e7fbb3a

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

@@ -3,6 +3,10 @@
3
 ## github 认证
3
 ## github 认证
4
 1. [https://www.baeldung.com/spring-oauth-login-webflux](https://www.baeldung.com/spring-oauth-login-webflux)
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
 	@Value("${password.salt}")
33
 	@Value("${password.salt}")
34
 	private String encryptSalt;
34
 	private String encryptSalt;
35
+	
36
+	@Value("${jwt.salt}")
37
+	private String jwtSalt;
35
 
38
 
36
 	/**
39
 	/**
37
 	 * 注册shiro的Filter,拦截请求
40
 	 * 注册shiro的Filter,拦截请求
@@ -82,7 +85,7 @@ public class ShiroConfiguration {
82
      */
85
      */
83
     @Bean("jwtRealm")
86
     @Bean("jwtRealm")
84
     public Realm jwtShiroRealm(UserService userService) {
87
     public Realm jwtShiroRealm(UserService userService) {
85
-        JWTShiroRealm myShiroRealm = new JWTShiroRealm(userService);
88
+        JWTShiroRealm myShiroRealm = new JWTShiroRealm(userService, jwtSalt);
86
         return myShiroRealm;
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
 	public Mono<String> logout() {
63
 	public Mono<String> logout() {
64
 		Subject subject = SecurityUtils.getSubject();
64
 		Subject subject = SecurityUtils.getSubject();
65
 		if (subject.getPrincipals() != null) {
65
 		if (subject.getPrincipals() != null) {
66
-			UserDto user = (UserDto) subject.getPrincipals().getPrimaryPrincipal();
67
-			userService.deleteLoginInfo(user.getUsername());
68
 		}
66
 		}
69
 		SecurityUtils.getSubject().logout();
67
 		SecurityUtils.getSubject().logout();
70
 		return Mono.empty();
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
     @Override
76
     @Override
77
     protected AuthenticationToken createToken(ServletRequest servletRequest, ServletResponse servletResponse) {
77
     protected AuthenticationToken createToken(ServletRequest servletRequest, ServletResponse servletResponse) {
78
         String jwtToken = getAuthzHeader(servletRequest);
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
         return null;
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
 public class JWTShiroRealm extends AuthorizingRealm {
22
 public class JWTShiroRealm extends AuthorizingRealm {
23
 
23
 
24
     protected UserService userService;
24
     protected UserService userService;
25
+    
26
+    private String jwtSalt;
25
 
27
 
26
-    public JWTShiroRealm(UserService userService){
28
+    public JWTShiroRealm(UserService userService, String jwtSalt){
27
         this.userService = userService;
29
         this.userService = userService;
28
         this.setCredentialsMatcher(new JWTCredentialsMatcher());
30
         this.setCredentialsMatcher(new JWTCredentialsMatcher());
31
+        this.jwtSalt = jwtSalt;
29
     }
32
     }
30
 
33
 
31
     @Override
34
     @Override
@@ -42,7 +45,7 @@ public class JWTShiroRealm extends AuthorizingRealm {
42
         JWTToken jwtToken = (JWTToken) authcToken;
45
         JWTToken jwtToken = (JWTToken) authcToken;
43
         String token = jwtToken.getToken();
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
         if(user == null)
49
         if(user == null)
47
             throw new AuthenticationException("token过期,请重新登录");
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
 package com.yaozhitech.spring5.service;
1
 package com.yaozhitech.spring5.service;
2
 
2
 
3
-import java.time.Duration;
4
 import java.util.Arrays;
3
 import java.util.Arrays;
5
 import java.util.List;
4
 import java.util.List;
6
 
5
 
7
 import org.apache.shiro.crypto.hash.Sha256Hash;
6
 import org.apache.shiro.crypto.hash.Sha256Hash;
8
-import org.springframework.beans.factory.annotation.Autowired;
9
 import org.springframework.beans.factory.annotation.Value;
7
 import org.springframework.beans.factory.annotation.Value;
10
-import org.springframework.data.redis.core.StringRedisTemplate;
11
 import org.springframework.stereotype.Service;
8
 import org.springframework.stereotype.Service;
12
 
9
 
13
 import com.yaozhitech.spring5.dto.UserDto;
10
 import com.yaozhitech.spring5.dto.UserDto;
@@ -18,9 +15,9 @@ public class UserService {
18
 
15
 
19
 	@Value("${password.salt}")
16
 	@Value("${password.salt}")
20
 	private String encryptSalt;
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
 	 * 保存user登录信息,返回token
23
 	 * 保存user登录信息,返回token
@@ -28,9 +25,7 @@ public class UserService {
28
 	 * @param userDto
25
 	 * @param userDto
29
 	 */
26
 	 */
30
 	public String generateJwtToken(String username) {
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
 	 * @return
35
 	 * @return
41
 	 */
36
 	 */
42
 	public UserDto getJwtTokenInfo(String username) {
37
 	public UserDto getJwtTokenInfo(String username) {
43
-		String salt = redisTemplate.opsForValue().get("token:"+username);
44
 		UserDto user = getUserInfo(username);
38
 		UserDto user = getUserInfo(username);
45
-		user.setSalt(salt);
39
+		user.setSalt(jwtSalt);
46
 		return user;
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
 	 * @param userName
46
 	 * @param userName
@@ -65,7 +49,7 @@ public class UserService {
65
 	public UserDto getUserInfo(String userName) {
49
 	public UserDto getUserInfo(String userName) {
66
 		UserDto user = new UserDto();
50
 		UserDto user = new UserDto();
67
 		user.setUserId(1L);
51
 		user.setUserId(1L);
68
-		user.setUsername("admin");
52
+		user.setUsername(userName);
69
 		user.setEncryptPwd(new Sha256Hash("123456", encryptSalt).toHex());
53
 		user.setEncryptPwd(new Sha256Hash("123456", encryptSalt).toHex());
70
 		return user;
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
 import java.util.Calendar;
4
 import java.util.Calendar;
5
 import java.util.Date;
5
 import java.util.Date;
6
 
6
 
7
-import org.apache.shiro.crypto.SecureRandomNumberGenerator;
8
-
9
 import com.auth0.jwt.JWT;
7
 import com.auth0.jwt.JWT;
8
+import com.auth0.jwt.JWTVerifier;
10
 import com.auth0.jwt.algorithms.Algorithm;
9
 import com.auth0.jwt.algorithms.Algorithm;
11
 import com.auth0.jwt.exceptions.JWTDecodeException;
10
 import com.auth0.jwt.exceptions.JWTDecodeException;
12
 import com.auth0.jwt.interfaces.DecodedJWT;
11
 import com.auth0.jwt.interfaces.DecodedJWT;
13
 
12
 
13
+import lombok.extern.slf4j.Slf4j;
14
+
15
+@Slf4j
14
 public class JwtUtils {
16
 public class JwtUtils {
15
 
17
 
16
 	/**
18
 	/**
@@ -38,6 +40,19 @@ public class JwtUtils {
38
             return null;
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
      * 生成签名,expireTime后过期
58
      * 生成签名,expireTime后过期
@@ -70,13 +85,13 @@ public class JwtUtils {
70
         return jwt.getExpiresAt().before(now);
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
     password: huojutech!23
20
     password: huojutech!23
21
   
21
   
22
 password:
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
 		log.info(token);
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
 		return ResponseEntity.ok(token);
52
 		return ResponseEntity.ok(token);
49
 	}
53
 	}