AbstractAuthenticationProvider.java 9.9 KB
Newer Older
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
1
/*
M
220413  
MaxKey 已提交
2
 * Copyright [2022] [MaxKey of copyright http://www.maxkey.top]
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
 * 
 * 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.
 */
 

MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
18 19
package org.maxkey.authn;

20
import java.util.ArrayList;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
21 22
import java.util.HashMap;

M
MaxKey 已提交
23
import org.maxkey.authn.jwt.AuthJwtService;
M
MaxKey 已提交
24
import org.maxkey.authn.online.OnlineTicketService;
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
25
import org.maxkey.authn.realm.AbstractAuthenticationRealm;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
26
import org.maxkey.configuration.ApplicationConfig;
M
v 3.3.0  
MaxKey 已提交
27 28
import org.maxkey.constants.ConstsLoginType;
import org.maxkey.constants.ConstsStatus;
M
MaxKey 已提交
29
import org.maxkey.entity.UserInfo;
M
MaxKey 已提交
30
import org.maxkey.password.onetimepwd.AbstractOtpAuthn;
M
v 3.3.0  
MaxKey 已提交
31
import org.maxkey.password.onetimepwd.OtpAuthnService;
M
MaxKey 已提交
32
import org.maxkey.persistence.MomentaryService;
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
33 34 35 36 37 38 39
import org.maxkey.web.WebConstants;
import org.maxkey.web.WebContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
40 41
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
42
/**
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
43
 * login Authentication abstract class.
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
44 45 46 47
 * 
 * @author Crystal.Sea
 *
 */
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
48
public abstract class AbstractAuthenticationProvider {
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
49 50
    private static final Logger _logger = 
            LoggerFactory.getLogger(AbstractAuthenticationProvider.class);
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
51

M
MaxKey 已提交
52 53 54 55
    public class AuthType{
    	public final static String NORMAL 	= "normal";
    	public final static String TFA 		= "tfa";
    	public final static String MOBILE 	= "mobile";
M
MaxKey 已提交
56
    	public final static String TRUSTED 	= "trusted";
M
MaxKey 已提交
57
    }
M
MaxKey 已提交
58 59 60 61 62 63
    
    protected static String PROVIDER_SUFFIX = "AuthenticationProvider";
    
    private  static HashMap<String,AbstractAuthenticationProvider> providers = 
    									new HashMap<String,AbstractAuthenticationProvider>();
    
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
64 65 66 67
    protected ApplicationConfig applicationConfig;

    protected AbstractAuthenticationRealm authenticationRealm;

M
Opt  
MaxKey 已提交
68
    protected AbstractOtpAuthn tfaOtpAuthn;
M
MaxKey 已提交
69
    
M
v 3.3.0  
MaxKey 已提交
70
    protected OtpAuthnService otpAuthnService;
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
71

M
MaxKey 已提交
72
    protected OnlineTicketService onlineTicketServices;
73
    
M
MaxKey 已提交
74 75 76 77
    protected MomentaryService momentaryService;
    
    protected AuthJwtService authJwtService;
    
M
MaxKey 已提交
78
    public static  ArrayList<GrantedAuthority> grantedAdministratorsAuthoritys = new ArrayList<GrantedAuthority>();
79 80 81 82
    
    static {
        grantedAdministratorsAuthoritys.add(new SimpleGrantedAuthority("ROLE_ADMINISTRATORS"));
    }
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
83

M
MaxKey 已提交
84
    public abstract String getProviderName();
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
85

M
MaxKey 已提交
86
    public abstract Authentication doAuthenticate(LoginCredential authentication);
87
    
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
88
    @SuppressWarnings("rawtypes")
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
89
    public boolean supports(Class authentication) {
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
90 91 92
        return (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication));
    }

M
MaxKey 已提交
93 94 95 96 97 98 99
    public Authentication authenticate(LoginCredential authentication){
    	if(authentication.getAuthType().equalsIgnoreCase("trusted")) {
    		return null;
    	}
    	AbstractAuthenticationProvider provider = providers.get(authentication.getAuthType() + PROVIDER_SUFFIX);
    	
    	return provider == null ? null : provider.doAuthenticate(authentication);
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
100
    }
M
MaxKey 已提交
101 102 103 104
    
    public Authentication authenticate(LoginCredential authentication,boolean trusted){
    	AbstractAuthenticationProvider provider = providers.get(AuthType.TRUSTED + PROVIDER_SUFFIX);
    	return provider == null ? null : provider.doAuthenticate(authentication);
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
105
    }
M
MaxKey 已提交
106 107 108
    
    public void addAuthenticationProvider(AbstractAuthenticationProvider provider) {
    	providers.put(provider.getProviderName(), provider);
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
109 110
    }
    /**
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
111
     * captcha validate .
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
112
     * 
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
113 114
     * @param authType String
     * @param captcha String
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
115
     */
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
116
    protected void captchaValid(String captcha, String authType) {
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
117
        // for basic
M
MaxKey 已提交
118
        if (authType.equalsIgnoreCase(AuthType.NORMAL)) {
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
119 120 121 122 123 124 125 126 127
            _logger.info("captcha : "
                    + WebContext.getSession().getAttribute(
                            WebConstants.KAPTCHA_SESSION_KEY).toString());
            if (captcha == null || !captcha
                    .equals(WebContext.getSession().getAttribute(
                                    WebConstants.KAPTCHA_SESSION_KEY).toString())) {
                String message = WebContext.getI18nValue("login.error.captcha");
                _logger.debug("login captcha valid error.");
                throw new BadCredentialsException(message);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
128
            }
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
129 130
        }
    }
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
131

MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
132
    /**
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
133
     * captcha validate.
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
134
     * 
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
135 136 137
     * @param otpCaptcha String
     * @param authType   String
     * @param userInfo   UserInfo
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
138
     */
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
139 140
    protected void tftcaptchaValid(String otpCaptcha, String authType, UserInfo userInfo) {
        // for one time password 2 factor
M
MaxKey 已提交
141 142
        if (applicationConfig.getLoginConfig().isMfa() 
        		&& authType.equalsIgnoreCase(AuthType.TFA)) {
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
143 144
            UserInfo validUserInfo = new UserInfo();
            validUserInfo.setUsername(userInfo.getUsername());
M
MaxKey 已提交
145
            validUserInfo.setSharedSecret(userInfo.getSharedSecret());
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
146 147
            validUserInfo.setSharedCounter(userInfo.getSharedCounter());
            validUserInfo.setId(userInfo.getId());
M
Opt  
MaxKey 已提交
148
            if (otpCaptcha == null || !tfaOtpAuthn.validate(validUserInfo, otpCaptcha)) {
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
149 150 151
                String message = WebContext.getI18nValue("login.error.captcha");
                _logger.debug("login captcha valid error.");
                throw new BadCredentialsException(message);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
152 153
            }
        }
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
154
    }
M
MaxKey 已提交
155
    
M
MaxKey 已提交
156

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
157

MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
158
    /**
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
159
     * login user by j_username and j_cname first query user by j_cname if first
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
160
     * step userinfo is null,query user from system.
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
161
     * 
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
162 163
     * @param username String
     * @param password String
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
164 165
     * @return
     */
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
166
    public UserInfo loadUserInfo(String username, String password) {
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
167
        UserInfo userInfo = authenticationRealm.loadUserInfo(username, password);
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
168

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
169 170 171 172 173 174
        if (userInfo != null) {
            if (userInfo.getUserType() == "SYSTEM") {
                _logger.debug("SYSTEM User Login. ");
            } else {
                _logger.debug("User Login. ");
            }
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
175
            
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
176 177 178
        }

        return userInfo;
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
179
    }
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
180

MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
181
    /**
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
182
     * check input password empty.
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
183
     * 
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
184
     * @param password String
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
185 186
     * @return
     */
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
187 188
    protected boolean emptyPasswordValid(String password) {
        if (null == password || "".equals(password)) {
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
189 190 191
            throw new BadCredentialsException(WebContext.getI18nValue("login.error.password.null"));
        }
        return true;
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
192
    }
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
193

MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
194
    /**
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
195
     * check input username or password empty.
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
196
     * 
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
197
     * @param email String
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
198 199
     * @return
     */
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
200 201
    protected boolean emptyEmailValid(String email) {
        if (null == email || "".equals(email)) {
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
202 203 204
            throw new BadCredentialsException("login.error.email.null");
        }
        return true;
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
205
    }
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
206

MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
207
    /**
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
208
     * check input username empty.
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
209
     * 
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
210
     * @param username String
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
211 212
     * @return
     */
MaxKey单点登录官方's avatar
v1.3 RC  
MaxKey单点登录官方 已提交
213 214
    protected boolean emptyUsernameValid(String username) {
        if (null == username || "".equals(username)) {
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
215 216 217
            throw new BadCredentialsException(WebContext.getI18nValue("login.error.username.null"));
        }
        return true;
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
218
    }
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
219

M
MaxKey 已提交
220
    protected boolean statusValid(LoginCredential loginCredential , UserInfo userInfo) {
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
221
        if (null == userInfo) {
M
MaxKey 已提交
222 223 224
            String i18nMessage = WebContext.getI18nValue("login.error.username");
            _logger.debug("login user  " + loginCredential.getUsername() + " not in this System ." + i18nMessage);
            UserInfo loginUser = new UserInfo(loginCredential.getUsername());
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
225
            loginUser.setId(loginUser.generateId());
M
MaxKey 已提交
226
            loginUser.setUsername(loginCredential.getUsername());
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
227 228
            loginUser.setDisplayName("not exist");
            loginUser.setLoginCount(0);
M
MaxKey 已提交
229 230
            authenticationRealm.insertLoginHistory(
            			loginUser, 
M
v 3.3.0  
MaxKey 已提交
231
            			ConstsLoginType.LOCAL, 
M
MaxKey 已提交
232 233 234 235 236
            			"",
            			i18nMessage,
            			WebConstants.LOGIN_RESULT.USER_NOT_EXIST);
            throw new BadCredentialsException(i18nMessage);
        }else {
M
v 3.3.0  
MaxKey 已提交
237
        	if(userInfo.getIsLocked()==ConstsStatus.LOCK) {
M
MaxKey 已提交
238 239 240 241 242 243 244
        		authenticationRealm.insertLoginHistory( 
        				userInfo, 
                        loginCredential.getAuthType(), 
                        loginCredential.getProvider(), 
                        loginCredential.getCode(), 
                        WebConstants.LOGIN_RESULT.USER_LOCKED
                    );
M
v 3.3.0  
MaxKey 已提交
245
        	}else if(userInfo.getStatus()!=ConstsStatus.ACTIVE) {
M
MaxKey 已提交
246 247 248 249 250 251 252 253
        		authenticationRealm.insertLoginHistory( 
        				userInfo, 
                        loginCredential.getAuthType(), 
                        loginCredential.getProvider(), 
                        loginCredential.getCode(), 
                        WebConstants.LOGIN_RESULT.USER_INACTIVE
                    );
        	}
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
254 255
        }
        return true;
MaxKey单点登录官方's avatar
init  
MaxKey单点登录官方 已提交
256
    }
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
257

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
258 259 260 261 262 263 264 265
    public void setApplicationConfig(ApplicationConfig applicationConfig) {
        this.applicationConfig = applicationConfig;
    }

    public void setAuthenticationRealm(AbstractAuthenticationRealm authenticationRealm) {
        this.authenticationRealm = authenticationRealm;
    }

M
Opt  
MaxKey 已提交
266 267
    public void setTfaOtpAuthn(AbstractOtpAuthn tfaOtpAuthn) {
        this.tfaOtpAuthn = tfaOtpAuthn;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
268 269
    }

M
MaxKey 已提交
270
    public void setOnlineTicketServices(OnlineTicketService onlineTicketServices) {
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
271 272 273
        this.onlineTicketServices = onlineTicketServices;
    }

M
v 3.3.0  
MaxKey 已提交
274 275
	public void setOtpAuthnService(OtpAuthnService otpAuthnService) {
		this.otpAuthnService = otpAuthnService;
M
MaxKey 已提交
276
	}
M
v 3.3.0  
MaxKey 已提交
277

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
278
}