Răsfoiți Sursa

SessionManager optimize

MaxKey 3 ani în urmă
părinte
comite
25e1904c1f
17 a modificat fișierele cu 215 adăugiri și 189 ștergeri
  1. 1 1
      gradle.properties
  2. 2 1
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/realm/AbstractAuthenticationRealm.java
  3. 16 9
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/realm/jdbc/JdbcAuthenticationRealm.java
  4. 5 1
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/realm/ldap/LdapAuthenticationRealm.java
  5. 0 126
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/AbstractSessionManager.java
  6. 18 14
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/InMemorySessionManager.java
  7. 18 4
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/RedisSessionManager.java
  8. 0 2
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/SessionManager.java
  9. 131 15
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/SessionManagerFactory.java
  10. 1 1
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/autoconfigure/AuthenticationAutoConfiguration.java
  11. 13 5
      maxkey-core/src/main/java/org/maxkey/persistence/repository/PasswordPolicyValidator.java
  12. 1 1
      maxkey-web-frontend/maxkey-web-app/src/app/shared/consts.ts
  13. 1 1
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/shared/consts.ts
  14. 5 5
      maxkey-webs/maxkey-gataway/src/main/resources/application.yml
  15. 1 1
      maxkey-webs/maxkey-monitor/src/main/resources/application.properties
  16. 1 1
      maxkey-webs/maxkey-web-maxkey/src/main/resources/application.properties
  17. 1 1
      maxkey-webs/maxkey-web-mgt/src/main/resources/application.properties

+ 1 - 1
gradle.properties

@@ -65,7 +65,7 @@ tomcatembedloggingjuliVersion   =8.5.2
 springVersion                   =5.3.20
 springBootVersion               =2.6.7
 springSecurityVersion           =5.6.3
-springDataVersion               =2.6.2
+springDataVersion               =2.6.4
 springSessionVersion            =2.6.3
 springkafkaVersion              =2.8.2
 springretryVersion              =1.3.0

+ 2 - 1
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/realm/AbstractAuthenticationRealm.java

@@ -124,7 +124,8 @@ public abstract class AbstractAuthenticationRealm {
         historyLogin.setSessionId(WebContext.genId());
         historyLogin.setSessionStatus(7);
         Authentication  authentication  = (Authentication ) WebContext.getAttribute(WebConstants.AUTHENTICATION);
-        if(authentication.getPrincipal() instanceof SignPrincipal) {
+        if(authentication != null 
+        		&& authentication.getPrincipal() instanceof SignPrincipal) {
         	  historyLogin.setSessionStatus(1);
               historyLogin.setSessionId(userInfo.getSessionId());
         }

+ 16 - 9
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/realm/jdbc/JdbcAuthenticationRealm.java

@@ -21,6 +21,7 @@ import org.maxkey.authn.realm.AbstractAuthenticationRealm;
 import org.maxkey.authn.realm.ldap.LdapAuthenticationRealm;
 import org.maxkey.authn.realm.ldap.LdapAuthenticationRealmService;
 import org.maxkey.constants.ConstsLoginType;
+import org.maxkey.constants.ConstsStatus;
 import org.maxkey.entity.ChangePassword;
 import org.maxkey.entity.PasswordPolicy;
 import org.maxkey.entity.UserInfo;
@@ -100,15 +101,21 @@ public class JdbcAuthenticationRealm extends AbstractAuthenticationRealm {
         if(ldapAuthenticationRealmService != null) {
         	//passwordMatches == false and ldapSupport ==true
         	//validate password with LDAP
-	        LdapAuthenticationRealm ldapRealm = ldapAuthenticationRealmService.getByInstId(userInfo.getInstId());
-	        if(!passwordMatches && ldapRealm != null && ldapRealm.isLdapSupport()) {
-	            passwordMatches = ldapRealm.passwordMatches(userInfo, password);
-	            if(passwordMatches) {
-	                //write password to database Realm
-	            	ChangePassword changePassword = new ChangePassword(userInfo);
-	                changePassword.setPassword(password);
-	                userInfoService.changePassword(changePassword, false);
-	            }
+	        try {
+	        	LdapAuthenticationRealm ldapRealm = ldapAuthenticationRealmService.getByInstId(userInfo.getInstId());
+	        	if(!passwordMatches && ldapRealm != null 
+		        		&& ldapRealm.isLdapSupport() 
+		        		&& userInfo.getIsLocked() == ConstsStatus.ACTIVE) {
+		            passwordMatches = ldapRealm.passwordMatches(userInfo, password);
+		            if(passwordMatches) {
+		                //write password to database Realm
+		            	ChangePassword changePassword = new ChangePassword(userInfo);
+		                changePassword.setPassword(password);
+		                userInfoService.changePassword(changePassword, false);
+		            }
+		        }
+	        }catch(Exception e) {
+	        	_logger.debug("passwordvalid Exception : {}" , e);
 	        }
         }
         _logger.debug("passwordvalid : {}" , passwordMatches);

+ 5 - 1
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/realm/ldap/LdapAuthenticationRealm.java

@@ -66,7 +66,11 @@ public class LdapAuthenticationRealm  extends AbstractAuthenticationRealm{
 				 username = userInfo.getWindowsAccount();
 			 }
             _logger.debug("Attempting to authenticate {} at {}", username, ldapServer);
-            isAuthenticated= ldapServer.authenticate(username, password);
+            try {
+            	isAuthenticated = ldapServer.authenticate(username, password);
+            }catch(Exception e) {
+            	_logger.debug("Attempting Authenticated fail .");
+            }
             if (isAuthenticated ) {
             	return true;
             }

+ 0 - 126
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/AbstractSessionManager.java

@@ -1,126 +0,0 @@
-/*
- * Copyright [2022] [MaxKey of copyright http://www.maxkey.top]
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *     http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- 
-
-package org.maxkey.authn.session;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.time.LocalTime;
-import java.util.Date;
-import java.util.List;
-
-import org.maxkey.entity.HistoryLogin;
-import org.maxkey.entity.UserInfo;
-import org.maxkey.util.DateUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.RowMapper;
-
-public class AbstractSessionManager  implements SessionManager{
-	private static Logger _logger = LoggerFactory.getLogger(AbstractSessionManager.class);
-	
-	protected JdbcTemplate jdbcTemplate;
-	
-	protected int validitySeconds = 60 * 30; //default 30 minutes.
-	
-	private static final String DEFAULT_DEFAULT_SELECT_STATEMENT = 
-			"select id,sessionid,userId,username,displayname,logintime from mxk_history_login where sessionstatus = 1";
-	
-    private static final String LOGOUT_USERINFO_UPDATE_STATEMENT = 
-    		"update mxk_userinfo set lastlogofftime = ? , online = " + UserInfo.ONLINE.OFFLINE + "  where id = ?";
-	
-    private static final String HISTORY_LOGOUT_UPDATE_STATEMENT = 
-    		"update mxk_history_login set logouttime = ? ,sessionstatus = 7 where  sessionid = ?";
-
-    @Override
-	public List<HistoryLogin> querySessions() {
-		List<HistoryLogin> listSessions = jdbcTemplate.query(
-				DEFAULT_DEFAULT_SELECT_STATEMENT, 
-				new OnlineTicketRowMapper());
-		return listSessions;
-	}
-	
-    public void profileLastLogoffTime(String userId,String lastLogoffTime) {
-        _logger.trace("userId {} , lastlogofftime {}" ,userId, lastLogoffTime);
-        jdbcTemplate.update(	LOGOUT_USERINFO_UPDATE_STATEMENT, 
-        		new Object[] { lastLogoffTime, userId },
-                new int[] { 	Types.TIMESTAMP, Types.VARCHAR });
-    }
-    
-    public void sessionLogoff(String sessionId,String lastLogoffTime) {
-        _logger.trace("sessionId {} , lastlogofftime {}" ,sessionId, lastLogoffTime);
-        jdbcTemplate.update(HISTORY_LOGOUT_UPDATE_STATEMENT,
-                new Object[] { lastLogoffTime, sessionId },                           
-                new int[] { Types.VARCHAR, Types.VARCHAR });
-    }
-    
-    @Override
-    public void terminate(String onlineTicket,String userId,String username) {
-    	String lastLogoffTime = DateUtils.formatDateTime(new Date());
-    	 _logger.trace("{} user {} terminate Ticket {} ." ,lastLogoffTime,username, onlineTicket);
-    	this.profileLastLogoffTime(userId, lastLogoffTime);
-    	this.sessionLogoff(onlineTicket, lastLogoffTime);
-    	remove(onlineTicket);
-    }
-    
-	private final class OnlineTicketRowMapper  implements RowMapper<HistoryLogin> {
-		@Override
-		public HistoryLogin mapRow(ResultSet rs, int rowNum)
-				throws SQLException {
-			HistoryLogin history=new HistoryLogin();
-			history.setId(rs.getString(1));
-			history.setSessionId(rs.getString(2));
-			history.setUserId(rs.getString(3));
-			history.setUsername(rs.getString(4));
-			history.setDisplayName(rs.getString(5));
-			history.setLoginTime(rs.getString(6));
-			return history;
-		}
-	}
-
-	@Override
-	public void create(String sessionId, Session session) {
-		
-	}
-
-	@Override
-	public Session remove(String sessionId) {
-		return null;
-	}
-
-	@Override
-	public Session get(String sessionId) {
-		return null;
-	}
-
-	@Override
-	public Session refresh(String sessionId, LocalTime refreshTime) {
-		return null;
-	}
-
-	@Override
-	public Session refresh(String sessionId) {
-		return null;
-	}
-
-	@Override
-	public void setValiditySeconds(int validitySeconds) {
-		
-	}
-}

+ 18 - 14
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/InMemorySessionManager.java

@@ -19,28 +19,30 @@ package org.maxkey.authn.session;
 
 import java.time.Duration;
 import java.time.LocalTime;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 
+import org.maxkey.entity.HistoryLogin;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.jdbc.core.JdbcTemplate;
 
 import com.github.benmanes.caffeine.cache.Cache;
 import com.github.benmanes.caffeine.cache.Caffeine;
 
 
-public class InMemorySessionManager extends AbstractSessionManager{
+public class InMemorySessionManager implements SessionManager{
     private static final Logger _logger = LoggerFactory.getLogger(InMemorySessionManager.class);
 
+    protected int validitySeconds = 60 * 30; //default 30 minutes.
+    
 	protected  static  Cache<String, Session> sessionStore = 
         	        Caffeine.newBuilder()
         	            .expireAfterWrite(10, TimeUnit.MINUTES)
         	            .maximumSize(2000000)
         	            .build();
 	
-	public InMemorySessionManager(JdbcTemplate jdbcTemplate,int validitySeconds) {
+	public InMemorySessionManager(int validitySeconds) {
         super();
-        this.jdbcTemplate = jdbcTemplate;
         sessionStore = 
                 Caffeine.newBuilder()
                     .expireAfterWrite(validitySeconds, TimeUnit.SECONDS)
@@ -68,16 +70,6 @@ public class InMemorySessionManager extends AbstractSessionManager{
     }
 
     @Override
-    public void setValiditySeconds(int validitySeconds) {
-    	sessionStore = 
-                Caffeine.newBuilder()
-                    .expireAfterWrite(validitySeconds, TimeUnit.SECONDS)
-                    .maximumSize(200000)
-                    .build();
-        
-    }
-
-    @Override
     public Session refresh(String sessionId,LocalTime refreshTime) {
         Session session = get(sessionId);
         session.setLastAccessTime(refreshTime);
@@ -101,4 +93,16 @@ public class InMemorySessionManager extends AbstractSessionManager{
         return session;
     }
 
+	@Override
+	public List<HistoryLogin> querySessions() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void terminate(String sessionId, String userId, String username) {
+		// TODO Auto-generated method stub
+		
+	}
+
 }

+ 18 - 4
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/RedisSessionManager.java

@@ -19,17 +19,20 @@ package org.maxkey.authn.session;
 
 import java.time.Duration;
 import java.time.LocalTime;
+import java.util.List;
 
+import org.maxkey.entity.HistoryLogin;
 import org.maxkey.persistence.redis.RedisConnection;
 import org.maxkey.persistence.redis.RedisConnectionFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.jdbc.core.JdbcTemplate;
 
 
-public class RedisSessionManager extends AbstractSessionManager {
+public class RedisSessionManager implements SessionManager {
     private static final Logger _logger = LoggerFactory.getLogger(RedisSessionManager.class);
 	
+    protected int validitySeconds = 60 * 30; //default 30 minutes.
+    
 	RedisConnectionFactory connectionFactory;
 	
 	public static String PREFIX="REDIS_SESSION_";
@@ -43,10 +46,9 @@ public class RedisSessionManager extends AbstractSessionManager {
 	 */
 	public RedisSessionManager(
 			RedisConnectionFactory connectionFactory,
-			JdbcTemplate jdbcTemplate,int validitySeconds) {
+			int validitySeconds) {
 		super();
 		this.connectionFactory = connectionFactory;
-		this.jdbcTemplate = jdbcTemplate;
 		this.validitySeconds = validitySeconds;
 	}
 	
@@ -118,5 +120,17 @@ public class RedisSessionManager extends AbstractSessionManager {
         return session;
     }
 
+	@Override
+	public List<HistoryLogin> querySessions() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void terminate(String sessionId, String userId, String username) {
+		// TODO Auto-generated method stub
+		
+	}
+
 	
 }

+ 0 - 2
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/SessionManager.java

@@ -33,8 +33,6 @@ public interface SessionManager {
     public Session refresh(String sessionId ,LocalTime refreshTime);
     
     public Session refresh(String sessionId);
-
-    public void setValiditySeconds(int validitySeconds);
     
     public List<HistoryLogin> querySessions();
     

+ 131 - 15
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/SessionManagerFactory.java

@@ -17,33 +17,149 @@
 
 package org.maxkey.authn.session;
 
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.time.LocalTime;
+import java.util.Date;
+import java.util.List;
+
 import org.maxkey.constants.ConstsPersistence;
+import org.maxkey.entity.HistoryLogin;
+import org.maxkey.entity.UserInfo;
 import org.maxkey.persistence.redis.RedisConnectionFactory;
+import org.maxkey.util.DateUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
 
-public class SessionManagerFactory {
+public class SessionManagerFactory implements SessionManager{
 	private static final  Logger _logger = 
             LoggerFactory.getLogger(SessionManagerFactory.class);
 	
-	 public SessionManager getManager(
-			 	int persistence,
+	private static final String DEFAULT_DEFAULT_SELECT_STATEMENT = 
+			"select id,sessionid,userId,username,displayname,logintime from mxk_history_login where sessionstatus = 1";
+	
+    private static final String LOGOUT_USERINFO_UPDATE_STATEMENT = 
+    		"update mxk_userinfo set lastlogofftime = ? , online = " + UserInfo.ONLINE.OFFLINE + "  where id = ?";
+	
+    private static final String HISTORY_LOGOUT_UPDATE_STATEMENT = 
+    		"update mxk_history_login set logouttime = ? ,sessionstatus = 7 where  sessionid = ?";
+    
+    private JdbcTemplate jdbcTemplate;
+    
+	private InMemorySessionManager 	inMemorySessionManager;
+	
+	private RedisSessionManager 	redisSessionManager;
+	
+	private boolean isRedis = false;					
+	
+	public SessionManagerFactory(int persistence,
 			 	JdbcTemplate jdbcTemplate,
 	            RedisConnectionFactory redisConnFactory,
-	            int validitySeconds){
-		 SessionManager sessionService = null;
-		if (persistence == ConstsPersistence.INMEMORY) {
-			sessionService = new InMemorySessionManager(jdbcTemplate,validitySeconds);
-		    _logger.debug("InMemorySessionManager");
-		} else if (persistence == ConstsPersistence.JDBC) {
-		    _logger.debug("JdbcSessionService not support "); 
-		} else if (persistence == ConstsPersistence.REDIS) {
-			sessionService = new RedisSessionManager(
-						redisConnFactory,jdbcTemplate,validitySeconds);
-		    _logger.debug("RedisSessionManager");
+	            int validitySeconds) {
+		 this.jdbcTemplate = jdbcTemplate;
+		 this.inMemorySessionManager = 
+				new InMemorySessionManager(validitySeconds);
+		 _logger.debug("InMemorySessionManager");
+		 if (persistence == ConstsPersistence.REDIS) {
+			isRedis = true;
+			this.redisSessionManager = 
+					new RedisSessionManager(redisConnFactory,validitySeconds);
+			_logger.debug("RedisSessionManager");
+		 }
+	}
+
+	public void create(String sessionId, Session session) {
+		inMemorySessionManager.create(sessionId, session);
+		if(isRedis) {
+			redisSessionManager.create(sessionId, session);
+		}
+	}
+
+	public Session remove(String sessionId) {
+		Session session = inMemorySessionManager.remove(sessionId);
+		if(isRedis) {
+			session = redisSessionManager.remove(sessionId);
+		}
+		return session;
+	}
+
+	public Session get(String sessionId) {
+		Session session = inMemorySessionManager.get(sessionId);
+		if(session == null && isRedis) {
+			session = redisSessionManager.get(sessionId);
+		}
+		return session;
+	}
+
+	public Session refresh(String sessionId, LocalTime refreshTime) {
+		Session session = null;
+		if(isRedis) {
+			session = redisSessionManager.refresh(sessionId,refreshTime);
+			//renew one
+			inMemorySessionManager.create(sessionId, session);
+		}else {
+			session = inMemorySessionManager.refresh(sessionId,refreshTime);
+		}
+		return session;
+	}
+
+	public Session refresh(String sessionId) {
+		Session session = null;
+		if(isRedis) {
+			session = redisSessionManager.refresh(sessionId);
+			//renew one
+			inMemorySessionManager.create(sessionId, session);
+		}else {
+			session = inMemorySessionManager.refresh(sessionId);
 		}
 		
-		return sessionService;
+		return session;
+	}
+
+	public List<HistoryLogin> querySessions() {
+		List<HistoryLogin> listSessions = jdbcTemplate.query(
+				DEFAULT_DEFAULT_SELECT_STATEMENT, 
+				new OnlineTicketRowMapper());
+		return listSessions;
+	}
+
+    private void profileLastLogoffTime(String userId,String lastLogoffTime) {
+        _logger.trace("userId {} , lastlogofftime {}" ,userId, lastLogoffTime);
+        jdbcTemplate.update(	LOGOUT_USERINFO_UPDATE_STATEMENT, 
+        		new Object[] { lastLogoffTime, userId },
+                new int[] { 	Types.TIMESTAMP, Types.VARCHAR });
+    }
+    
+    private void sessionLogoff(String sessionId,String lastLogoffTime) {
+        _logger.trace("sessionId {} , lastlogofftime {}" ,sessionId, lastLogoffTime);
+        jdbcTemplate.update(HISTORY_LOGOUT_UPDATE_STATEMENT,
+                new Object[] { lastLogoffTime, sessionId },                           
+                new int[] { Types.VARCHAR, Types.VARCHAR });
+    }
+    
+	public void terminate(String sessionId, String userId, String username) {
+		String lastLogoffTime = DateUtils.formatDateTime(new Date());
+	   	 _logger.trace("{} user {} terminate Ticket {} ." ,lastLogoffTime,username, sessionId);
+	   	this.profileLastLogoffTime(userId, lastLogoffTime);
+	   	this.sessionLogoff(sessionId, lastLogoffTime);
+	   	this.remove(sessionId);
+	}
+	
+	private final class OnlineTicketRowMapper  implements RowMapper<HistoryLogin> {
+		@Override
+		public HistoryLogin mapRow(ResultSet rs, int rowNum)
+				throws SQLException {
+			HistoryLogin history=new HistoryLogin();
+			history.setId(rs.getString(1));
+			history.setSessionId(rs.getString(2));
+			history.setUserId(rs.getString(3));
+			history.setUsername(rs.getString(4));
+			history.setDisplayName(rs.getString(5));
+			history.setLoginTime(rs.getString(6));
+			return history;
+		}
 	}
 }

+ 1 - 1
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/autoconfigure/AuthenticationAutoConfiguration.java

@@ -204,7 +204,7 @@ public class AuthenticationAutoConfiguration  implements InitializingBean {
             ) {
     	_logger.trace("session timeout " + timeout);
         SessionManager  sessionManager  = 
-                new SessionManagerFactory().getManager(
+                new SessionManagerFactory(
                 		persistence, jdbcTemplate, redisConnFactory,timeout);
         return sessionManager;
     }

+ 13 - 5
maxkey-core/src/main/java/org/maxkey/persistence/repository/PasswordPolicyValidator.java

@@ -222,10 +222,12 @@ public class PasswordPolicyValidator {
    public void lockUser(UserInfo userInfo) {
        try {
            if (userInfo != null && StringUtils.isNotEmpty(userInfo.getId())) {
-               jdbcTemplate.update(LOCK_USER_UPDATE_STATEMENT,
-                       new Object[] { ConstsStatus.LOCK, new Date(), userInfo.getId() },
-                       new int[] { Types.VARCHAR, Types.TIMESTAMP, Types.VARCHAR });
-               userInfo.setIsLocked(ConstsStatus.LOCK);
+        	   if(userInfo.getIsLocked() == ConstsStatus.ACTIVE) {
+	               jdbcTemplate.update(LOCK_USER_UPDATE_STATEMENT,
+	                       new Object[] { ConstsStatus.LOCK, new Date(), userInfo.getId() },
+	                       new int[] { Types.VARCHAR, Types.TIMESTAMP, Types.VARCHAR });
+	               userInfo.setIsLocked(ConstsStatus.LOCK);
+        	   }
            }
        } catch (Exception e) {
            _logger.error("lockUser Exception",e);
@@ -263,6 +265,7 @@ public class PasswordPolicyValidator {
                        new Object[] { 0, ConstsStatus.ACTIVE, new Date(), userInfo.getId() },
                        new int[] { Types.INTEGER, Types.INTEGER, Types.TIMESTAMP, Types.VARCHAR });
                userInfo.setIsLocked(ConstsStatus.ACTIVE);
+               userInfo.setBadPasswordCount(0);
            }
        } catch (Exception e) {
            _logger.error("resetAttempts Exception",e);
@@ -288,7 +291,12 @@ public class PasswordPolicyValidator {
        if (userInfo != null && StringUtils.isNotEmpty(userInfo.getId())) {
            userInfo.setBadPasswordCount(userInfo.getBadPasswordCount() + 1);
            setBadPasswordCount(userInfo.getId(),userInfo.getBadPasswordCount());
-           
+           PasswordPolicy passwordPolicy = passwordPolicyRepository.getPasswordPolicy();
+           if(userInfo.getBadPasswordCount() + 1 >= passwordPolicy.getAttempts()) {
+        	   _logger.debug("Bad Password Count {} , Max Attempts {}",
+        			   userInfo.getBadPasswordCount() + 1,passwordPolicy.getAttempts());
+        	   this.lockUser(userInfo);
+           }
        }
    }
    

+ 1 - 1
maxkey-web-frontend/maxkey-web-app/src/app/shared/consts.ts

@@ -21,5 +21,5 @@ export const CONSTS = {
     REDIRECT_URI: 'redirect_uri',
     REMEMBER: 'remember_me',
     TOKEN: '_token',
-    VERSION: 'v3.5.0 GA'
+    VERSION: 'v3.5.1 GA'
 };

+ 1 - 1
maxkey-web-frontend/maxkey-web-mgt-app/src/app/shared/consts.ts

@@ -19,5 +19,5 @@ export const CONSTS = {
     INST: 'inst',
     REDIRECT_URI: 'redirect_uri',
     REMEMBER: 'remember',
-    VERSION: 'v3.5.0 GA'
+    VERSION: 'v3.5.1 GA'
 };

+ 5 - 5
maxkey-webs/maxkey-gataway/src/main/resources/application.yml

@@ -1,7 +1,7 @@
 #端口号
 application:
   name: maxkey-gateway-server
-  formatted-version: v3.5.0 GA
+  formatted-version: v3.5.1 GA
 server:
   port: 9000
 spring:
@@ -12,17 +12,17 @@ spring:
       routes:
 #nacos健康检查端口8080
         - id: maxkeys_route
-          uri: lb://maxkey
+          uri: lb://sign
           filters:
             - PrefixPath=/
           predicates:
-            - Path=/maxkey/**
+            - Path=/sign/**
         - id: maxkey_mgts_route
-          uri: lb://maxkey-mgt
+          uri: lb://maxkey-mgt-api
           filters:
             - PrefixPath=/
           predicates:
-            - Path=/maxkey-mgt/**
+            - Path=/maxkey-mgt-api/**
 #      default-filters:
 #       - name: Hystrix
 #          args:

+ 1 - 1
maxkey-webs/maxkey-monitor/src/main/resources/application.properties

@@ -18,7 +18,7 @@
 application.title                               =MaxKey
 #for dynamic service discovery
 spring.application.name                         =maxkey-monitor
-application.formatted-version                   =v3.5.0 GA
+application.formatted-version                   =v3.5.1 GA
 #nacos discovery
 spring.cloud.nacos.discovery.enabled            =${NACOS_DISCOVERY_ENABLED:false}
 spring.cloud.nacos.discovery.instance-enabled   =false

+ 1 - 1
maxkey-webs/maxkey-web-maxkey/src/main/resources/application.properties

@@ -16,7 +16,7 @@
 #MaxKey Title and Version                                                  #
 ############################################################################
 application.title                           =MaxKey
-application.formatted-version               =v3.5.0 GA
+application.formatted-version               =v3.5.1 GA
 #for dynamic service discovery
 spring.application.name                     =maxkey
 ############################################################################

+ 1 - 1
maxkey-webs/maxkey-web-mgt/src/main/resources/application.properties

@@ -16,7 +16,7 @@
 #MaxKey Title and Version                                                  #
 ############################################################################
 application.title                               =MaxKey-Mgt
-application.formatted-version                   =v3.5.0 GA
+application.formatted-version                   =v3.5.1 GA
 #for dynamic service discovery
 spring.application.name                         =maxkey-mgt
 ############################################################################