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