From a5c00a1316fe9922ff87bf07a5e42c238a07d070 Mon Sep 17 00:00:00 2001
From: xieb <vip_xiaobin810@163.com>
Date: Thu, 10 Aug 2023 16:18:13 +0800
Subject: [PATCH] 单点登出

---
 skjcmanager/skjcmanager-auth/src/main/java/cn/gistack/auth/config/MyAuthenticationProvider.java |   54 ++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 34 insertions(+), 20 deletions(-)

diff --git a/skjcmanager/skjcmanager-auth/src/main/java/cn/gistack/auth/config/MyAuthenticationProvider.java b/skjcmanager/skjcmanager-auth/src/main/java/cn/gistack/auth/config/MyAuthenticationProvider.java
index ff0a454..0697282 100644
--- a/skjcmanager/skjcmanager-auth/src/main/java/cn/gistack/auth/config/MyAuthenticationProvider.java
+++ b/skjcmanager/skjcmanager-auth/src/main/java/cn/gistack/auth/config/MyAuthenticationProvider.java
@@ -1,5 +1,6 @@
 package cn.gistack.auth.config;
 
+import cn.gistack.auth.granter.PhoneTokenGranter;
 import cn.gistack.auth.utils.TokenUtil;
 import cn.gistack.common.cache.CacheNames;
 import com.alibaba.nacos.common.utils.StringUtils;
@@ -16,6 +17,7 @@
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.oauth2.common.exceptions.UserDeniedAuthorizationException;
 import org.springframework.stereotype.Component;
 import javax.servlet.http.HttpServletRequest;
 import java.time.Duration;
@@ -32,6 +34,13 @@
      * 免密常量
      */
     public static final String CUSTOM_LOGIN_SMS = "CUSTOM_LOGIN_SMS";
+    public static final String CUSTOM_LOGIN_WX = "CUSTOM_LOGIN_WX";
+
+    public static final String CUSTOM_LOGIN_OAUTH = "CUSTOM_LOGIN_OAUTH";
+
+	public static final String OAUTH = "oauth";
+	public static final String PHONE = "phone";
+	public static final String WX = "wx";
 
     @Autowired
 	private BladeRedis bladeRedis;
@@ -59,30 +68,35 @@
             throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
         } else {
 			String password = authentication.getCredentials().toString();
-			// 手机号登录时不验证密码
-			if(!CUSTOM_LOGIN_SMS.equals(password)){
-				HttpServletRequest request = WebUtil.getRequest();
-				String grantType = request.getParameter(TokenUtil.GRANT_TYPE_KEY);
-				// 获取租户ID
-				String headerTenant = request.getHeader(TokenUtil.TENANT_HEADER_KEY);
-				String paramTenant = request.getParameter(TokenUtil.TENANT_PARAM_KEY);
-				// 指定租户ID
-				String tenantId = StringUtils.isBlank(headerTenant) ? paramTenant : headerTenant;
-				String detailsPassword = userDetails.getPassword().substring(7);
-				if (!detailsPassword.equals(DigestUtil.hex(password))) {
 
-					int count = getFailCount(tenantId, userDetails.getUsername());
-					// 用户存在但密码错误,超过次数则锁定账号
-					if (grantType != null && !grantType.equals(TokenUtil.REFRESH_TOKEN_KEY)) {
-						setFailCount(tenantId, userDetails.getUsername(), count);
-						throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
-					}
-					this.logger.debug("Failed to authenticate since password does not match stored value");
-					throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
-				}
+			HttpServletRequest request = WebUtil.getRequest();
+			String grantType = request.getParameter(TokenUtil.GRANT_TYPE_KEY);
+			// 获取租户ID
+			String headerTenant = request.getHeader(TokenUtil.TENANT_HEADER_KEY);
+			String paramTenant = request.getParameter(TokenUtil.TENANT_PARAM_KEY);
+			// 指定租户ID
+			String tenantId = StringUtils.isBlank(headerTenant) ? paramTenant : headerTenant;
+
+			// 手机号短信登录时不验证密码、微信登录时不验证密码、单点登录时不验证密码
+			if (grantType.equals(PHONE) || grantType.equals(WX) || grantType.equals(OAUTH)) {
 				// 成功则清除登录错误次数
 				delFailCount(tenantId, userDetails.getUsername());
+				return;
 			}
+
+			String detailsPassword = userDetails.getPassword().substring(7);
+			if (!detailsPassword.equals(DigestUtil.hex(password))) {
+				int count = getFailCount(tenantId, userDetails.getUsername());
+				// 用户存在但密码错误,超过次数则锁定账号
+				if (grantType != null && !grantType.equals(TokenUtil.REFRESH_TOKEN_KEY)) {
+					setFailCount(tenantId, userDetails.getUsername(), count);
+					throw new UserDeniedAuthorizationException(TokenUtil.USER_NOT_FOUND);
+				}
+				this.logger.debug("Failed to authenticate since password does not match stored value");
+				throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
+			}
+			// 成功则清除登录错误次数
+			delFailCount(tenantId, userDetails.getUsername());
         }
     }
 

--
Gitblit v1.9.3