diff --git a/maxkey-authentications/maxkey-authentication-provider/src/main/java/org/dromara/maxkey/authn/provider/AbstractAuthenticationProvider.java b/maxkey-authentications/maxkey-authentication-provider/src/main/java/org/dromara/maxkey/authn/provider/AbstractAuthenticationProvider.java index f071789e0..1d8298da5 100644 --- a/maxkey-authentications/maxkey-authentication-provider/src/main/java/org/dromara/maxkey/authn/provider/AbstractAuthenticationProvider.java +++ b/maxkey-authentications/maxkey-authentication-provider/src/main/java/org/dromara/maxkey/authn/provider/AbstractAuthenticationProvider.java @@ -64,6 +64,11 @@ public abstract class AbstractAuthenticationProvider { * 扫描认证 */ public static final String SCAN_CODE = "scancode"; + + /** + * 手机端APP + */ + public static final String APP = "app"; } protected ApplicationConfig applicationConfig; diff --git a/maxkey-authentications/maxkey-authentication-provider/src/main/java/org/dromara/maxkey/authn/provider/impl/AppAuthenticationProvider.java b/maxkey-authentications/maxkey-authentication-provider/src/main/java/org/dromara/maxkey/authn/provider/impl/AppAuthenticationProvider.java new file mode 100644 index 000000000..3e1302d4f --- /dev/null +++ b/maxkey-authentications/maxkey-authentication-provider/src/main/java/org/dromara/maxkey/authn/provider/impl/AppAuthenticationProvider.java @@ -0,0 +1,96 @@ +package org.dromara.maxkey.authn.provider.impl; + +import org.dromara.maxkey.authn.LoginCredential; +import org.dromara.maxkey.authn.provider.AbstractAuthenticationProvider; +import org.dromara.maxkey.authn.realm.AbstractAuthenticationRealm; +import org.dromara.maxkey.authn.session.SessionManager; +import org.dromara.maxkey.constants.ConstsLoginType; +import org.dromara.maxkey.entity.idm.UserInfo; +import org.dromara.maxkey.web.WebConstants; +import org.dromara.maxkey.web.WebContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; + +/** + * @description: + * @author: orangeBabu + * @time: 19/8/2024 PM3:41 + */ +public class AppAuthenticationProvider extends AbstractAuthenticationProvider { + private static final Logger _logger = LoggerFactory.getLogger(AppAuthenticationProvider.class); + + public AppAuthenticationProvider() { + super(); + } + + public AppAuthenticationProvider( + AbstractAuthenticationRealm authenticationRealm, + SessionManager sessionManager) { + this.authenticationRealm = authenticationRealm; + this.sessionManager = sessionManager; + } + + + @Override + public String getProviderName() { + return "app" + PROVIDER_SUFFIX; + } + + @Override + public Authentication doAuthenticate(LoginCredential loginCredential) { + UsernamePasswordAuthenticationToken authenticationToken = null; + _logger.debug("Trying to authenticate user '{}' via {}", + loginCredential.getPrincipal(), getProviderName()); + try { + + _logger.debug("authentication {}", loginCredential); + + + emptyPasswordValid(loginCredential.getPassword()); + + emptyUsernameValid(loginCredential.getUsername()); + + //查询用户 + UserInfo userInfo = loadUserInfo(loginCredential.getUsername(), loginCredential.getPassword()); + + //Validate PasswordPolicy + authenticationRealm.getPasswordPolicyValidator().passwordPolicyValid(userInfo); + + statusValid(loginCredential, userInfo); + + //Match password + authenticationRealm.passwordMatches(userInfo, loginCredential.getPassword()); + + //apply PasswordSetType and resetBadPasswordCount + authenticationRealm.getPasswordPolicyValidator().applyPasswordPolicy(userInfo); + + authenticationToken = createOnlineTicket(loginCredential, userInfo); + // user authenticated + _logger.debug("'{}' authenticated successfully by {}.", + loginCredential.getPrincipal(), getProviderName()); + + authenticationRealm.insertLoginHistory(userInfo, + ConstsLoginType.LOCAL, + "", + "xe00000004", + WebConstants.LOGIN_RESULT.SUCCESS); + + } catch ( + AuthenticationException e) { + _logger.error("Failed to authenticate user {} via {}: {}", + loginCredential.getPrincipal(), + getProviderName(), + e.getMessage()); + WebContext.setAttribute( + WebConstants.LOGIN_ERROR_SESSION_MESSAGE, e.getMessage()); + } catch (Exception e) { + _logger.error("Login error Unexpected exception in {} authentication:\n{}", + getProviderName(), e.getMessage()); + } + + return authenticationToken; + } +} diff --git a/maxkey-authentications/maxkey-authentication-provider/src/main/java/org/dromara/maxkey/autoconfigure/AuthnProviderAutoConfiguration.java b/maxkey-authentications/maxkey-authentication-provider/src/main/java/org/dromara/maxkey/autoconfigure/AuthnProviderAutoConfiguration.java index 2bb59c5e5..c2a2c4a42 100644 --- a/maxkey-authentications/maxkey-authentication-provider/src/main/java/org/dromara/maxkey/autoconfigure/AuthnProviderAutoConfiguration.java +++ b/maxkey-authentications/maxkey-authentication-provider/src/main/java/org/dromara/maxkey/autoconfigure/AuthnProviderAutoConfiguration.java @@ -20,10 +20,7 @@ package org.dromara.maxkey.autoconfigure; import org.dromara.maxkey.authn.jwt.AuthTokenService; import org.dromara.maxkey.authn.provider.AbstractAuthenticationProvider; import org.dromara.maxkey.authn.provider.AuthenticationProviderFactory; -import org.dromara.maxkey.authn.provider.impl.MobileAuthenticationProvider; -import org.dromara.maxkey.authn.provider.impl.NormalAuthenticationProvider; -import org.dromara.maxkey.authn.provider.impl.ScanCodeAuthenticationProvider; -import org.dromara.maxkey.authn.provider.impl.TrustedAuthenticationProvider; +import org.dromara.maxkey.authn.provider.impl.*; import org.dromara.maxkey.authn.realm.AbstractAuthenticationRealm; import org.dromara.maxkey.authn.session.SessionManager; import org.dromara.maxkey.authn.support.rememberme.AbstractRemeberMeManager; @@ -51,13 +48,15 @@ public class AuthnProviderAutoConfiguration { NormalAuthenticationProvider normalAuthenticationProvider, MobileAuthenticationProvider mobileAuthenticationProvider, TrustedAuthenticationProvider trustedAuthenticationProvider, - ScanCodeAuthenticationProvider scanCodeAuthenticationProvider + ScanCodeAuthenticationProvider scanCodeAuthenticationProvider, + AppAuthenticationProvider appAuthenticationProvider ) { AuthenticationProviderFactory authenticationProvider = new AuthenticationProviderFactory(); authenticationProvider.addAuthenticationProvider(normalAuthenticationProvider); authenticationProvider.addAuthenticationProvider(mobileAuthenticationProvider); authenticationProvider.addAuthenticationProvider(trustedAuthenticationProvider); authenticationProvider.addAuthenticationProvider(scanCodeAuthenticationProvider); + authenticationProvider.addAuthenticationProvider(appAuthenticationProvider); return authenticationProvider; } @@ -89,6 +88,17 @@ public class AuthnProviderAutoConfiguration { ); } + @Bean + public AppAuthenticationProvider appAuthenticationProvider( + AbstractAuthenticationRealm authenticationRealm, + SessionManager sessionManager + ) { + return new AppAuthenticationProvider( + authenticationRealm, + sessionManager + ); + } + @Bean public MobileAuthenticationProvider mobileAuthenticationProvider( AbstractAuthenticationRealm authenticationRealm,