// Path: ki4so-core/src/main/java/com/github/ebnew/ki4so/core/authentication/handlers/AuthenticationHandler.java
// public interface AuthenticationHandler {
// 
// 	/**
// 	 * 认证方法，返回true表示认证成功，false表示认证失败
// 	 * 
// 	 * @param credential 用户凭据
// 	 * @return 是否认证通过。
// 	 * @throws  ，则抛出合适的认证错误异常对象。
// 	 */
// 	public boolean authenticate(KnightCredential credential) throws AuthenticationException;
// 
// 	/**
// 	 * 是否支持用户凭证credential的认证处理，返回值true表示支持，
// 	 * false表示不支持，若不支持该凭证，则忽略。
// 	 * 
// 	 * @param credential 用户凭据
// 	 */
// 	public boolean supports(KnightCredential credential);
// 
// }
// 
// Path: ki4so-core/src/main/java/com/github/ebnew/ki4so/core/authentication/resolvers/CredentialToPrincipalResolver.java
// public interface CredentialToPrincipalResolver {
// 	
// 	 /**
//      * 将用户凭据转换为对应的用户主体对象。
//      * @param 要转成用户主体的用户凭据对象。
//      * @return 转换后的用户主体对象。
//      */
//     KnightUser resolvePrincipal(KnightCredential credential);
// 
//     /**
//      * 判断是否支持该用户凭据。
//      * 
//      * @param 要检查的用户凭据。
//      * @return true表示支持，false表示不支持。
//      */
//     boolean supports(KnightCredential credential);
// 
// }
// 
// Path: ki4so-common/src/main/java/com/github/ebnew/ki4so/core/exception/UnsupportedCredentialsException.java
// public class UnsupportedCredentialsException extends InvalidCredentialException {
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = -4250926514996058588L;
// 
// 	/**
// 	 * 异常代码值。
// 	 */
// 	public static final String CODE = "UNSUPPORTED.CREDENTIALS.CODE";
// 	
// 	/**
// 	 * 异常信息键值，要转换为具体的语言值。
// 	 */
// 	public static final String MSG_KEY = "UNSUPPORTED.CREDENTIALS.MSG";
// 	
// 	public UnsupportedCredentialsException() {
// 		super(CODE, MSG_KEY);
// 	}
// }


import com.github.ebnew.ki4so.core.authentication.handlers.AuthenticationHandler;
import com.github.ebnew.ki4so.core.authentication.resolvers.CredentialToPrincipalResolver;
import com.github.ebnew.ki4so.core.exception.UnsupportedCredentialsException;
import org.apache.log4j.Logger;
import java.util.List;
package com.github.ebnew.ki4so.core.authentication;



/**
 * @author zhenglu
 * @since 15/4/23
 */
public class KnightAuthenticationManagerImpl implements KnightAuthenticationManager {

    public static final Logger logger = Logger.getLogger(KnightAuthenticationManagerImpl.class);


    /**
     * 认证处理器集合，使用多个认证处理器对凭证逐一认证，只要有一个通过即可
     */
    private List<AuthenticationHandler> authenticationHandlers;

    private List<CredentialToPrincipalResolver> credentialToPrincipalResolvers;
    /**
     * 认证成功后处理对象。
     */
    private KnightAuthenticationPostHandler authenticationPostHandler;



    @Override
    public KnightAuthentication authentication(KnightCredential credential) {
        //是否找到支持的凭据认证处理器
        boolean foundSupported = false;
        //是否认证通过
        boolean authenticated = false;
        if(credential == null){
            logger.info("credential is null");
            return null;
        }
        for(AuthenticationHandler handler : authenticationHandlers){
            if(handler.supports(credential)){
                foundSupported = true;
                authenticated =  handler.authenticate(credential);
                if(authenticated){
                    break;
                }
            }
        }
        //
        boolean foundCrentialResolve = false;
        KnightUser user = null;
// Path: ki4so-core/src/main/java/com/github/ebnew/ki4so/core/authentication/handlers/AuthenticationHandler.java
// public interface AuthenticationHandler {
// 
// 	/**
// 	 * 认证方法，返回true表示认证成功，false表示认证失败
// 	 * 
// 	 * @param credential 用户凭据
// 	 * @return 是否认证通过。
// 	 * @throws  ，则抛出合适的认证错误异常对象。
// 	 */
// 	public boolean authenticate(KnightCredential credential) throws AuthenticationException;
// 
// 	/**
// 	 * 是否支持用户凭证credential的认证处理，返回值true表示支持，
// 	 * false表示不支持，若不支持该凭证，则忽略。
// 	 * 
// 	 * @param credential 用户凭据
// 	 */
// 	public boolean supports(KnightCredential credential);
// 
// }
// 
// Path: ki4so-core/src/main/java/com/github/ebnew/ki4so/core/authentication/resolvers/CredentialToPrincipalResolver.java
// public interface CredentialToPrincipalResolver {
// 	
// 	 /**
//      * 将用户凭据转换为对应的用户主体对象。
//      * @param 要转成用户主体的用户凭据对象。
//      * @return 转换后的用户主体对象。
//      */
//     KnightUser resolvePrincipal(KnightCredential credential);
// 
//     /**
//      * 判断是否支持该用户凭据。
//      * 
//      * @param 要检查的用户凭据。
//      * @return true表示支持，false表示不支持。
//      */
//     boolean supports(KnightCredential credential);
// 
// }
// 
// Path: ki4so-common/src/main/java/com/github/ebnew/ki4so/core/exception/UnsupportedCredentialsException.java
// public class UnsupportedCredentialsException extends InvalidCredentialException {
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = -4250926514996058588L;
// 
// 	/**
// 	 * 异常代码值。
// 	 */
// 	public static final String CODE = "UNSUPPORTED.CREDENTIALS.CODE";
// 	
// 	/**
// 	 * 异常信息键值，要转换为具体的语言值。
// 	 */
// 	public static final String MSG_KEY = "UNSUPPORTED.CREDENTIALS.MSG";
// 	
// 	public UnsupportedCredentialsException() {
// 		super(CODE, MSG_KEY);
// 	}
// }


// Path: ki4so-core/src/main/java/com/github/ebnew/ki4so/core/authentication/KnightAuthenticationManagerImpl.java
import com.github.ebnew.ki4so.core.authentication.handlers.AuthenticationHandler;
import com.github.ebnew.ki4so.core.authentication.resolvers.CredentialToPrincipalResolver;
import com.github.ebnew.ki4so.core.exception.UnsupportedCredentialsException;
import org.apache.log4j.Logger;
import java.util.List;

package com.github.ebnew.ki4so.core.authentication;



/**
 * @author zhenglu
 * @since 15/4/23
 */
public class KnightAuthenticationManagerImpl implements KnightAuthenticationManager {

    public static final Logger logger = Logger.getLogger(KnightAuthenticationManagerImpl.class);


    /**
     * 认证处理器集合，使用多个认证处理器对凭证逐一认证，只要有一个通过即可
     */
    private List<AuthenticationHandler> authenticationHandlers;

    private List<CredentialToPrincipalResolver> credentialToPrincipalResolvers;
    /**
     * 认证成功后处理对象。
     */
    private KnightAuthenticationPostHandler authenticationPostHandler;



    @Override
    public KnightAuthentication authentication(KnightCredential credential) {
        //是否找到支持的凭据认证处理器
        boolean foundSupported = false;
        //是否认证通过
        boolean authenticated = false;
        if(credential == null){
            logger.info("credential is null");
            return null;
        }
        for(AuthenticationHandler handler : authenticationHandlers){
            if(handler.supports(credential)){
                foundSupported = true;
                authenticated =  handler.authenticate(credential);
                if(authenticated){
                    break;
                }
            }
        }
        //
        boolean foundCrentialResolve = false;
        KnightUser user = null;
        if(foundSupported && authenticated){