|  | @ -1,5 +1,5 @@
 | 
												
													
														
															|  | /**
 |  | /**
 | 
												
													
														
															|  |  *
 |  | 
 | 
												
													
														
															|  | 
 |  |  * 
 | 
												
													
														
															|  |  */
 |  |  */
 | 
												
													
														
															|  | package com.yihu.base.security.sms;
 |  | package com.yihu.base.security.sms;
 | 
												
													
														
															|  | 
 |  | 
 | 
												
											
												
													
														
															|  | @ -15,95 +15,98 @@ import javax.servlet.http.HttpServletRequest;
 | 
												
													
														
															|  | import javax.servlet.http.HttpServletResponse;
 |  | import javax.servlet.http.HttpServletResponse;
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | /**
 |  | /**
 | 
												
													
														
															|  |  * 短信登陆过滤器
 |  | 
 | 
												
													
														
															|  |  * @author chenweida
 |  | 
 | 
												
													
														
															|  | 
 |  |  * @author zhailiang
 | 
												
													
														
															|  | 
 |  |  *
 | 
												
													
														
															|  |  */
 |  |  */
 | 
												
													
														
															|  | public class SmsCodeAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
 |  | public class SmsCodeAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
 | 
												
													
														
															|  |     // ~ Static fields/initializers
 |  | 
 | 
												
													
														
															|  |     // =====================================================================================
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |     private String mobileParameter = SecurityProperties.mobileLoginKey;
 |  | 
 | 
												
													
														
															|  |     private boolean postOnly = true;
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |     // ~ Constructors
 |  | 
 | 
												
													
														
															|  |     // ===================================================================================================
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |     public SmsCodeAuthenticationFilter() {
 |  | 
 | 
												
													
														
															|  |         super(new AntPathRequestMatcher(SecurityProperties.mobileLogin, "POST"));
 |  | 
 | 
												
													
														
															|  |     }
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |     // ~ Methods
 |  | 
 | 
												
													
														
															|  |     // ========================================================================================================
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |     public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
 |  | 
 | 
												
													
														
															|  |             throws AuthenticationException {
 |  | 
 | 
												
													
														
															|  |         if (postOnly && !request.getMethod().equals("POST")) {
 |  | 
 | 
												
													
														
															|  |             throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
 |  | 
 | 
												
													
														
															|  |         }
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |         String mobile = obtainMobile(request);
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |         if (mobile == null) {
 |  | 
 | 
												
													
														
															|  |             mobile = "";
 |  | 
 | 
												
													
														
															|  |         }
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |         mobile = mobile.trim();
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |         SmsCodeAuthenticationToken authRequest = new SmsCodeAuthenticationToken(mobile);
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |         // Allow subclasses to set the "details" property
 |  | 
 | 
												
													
														
															|  |         setDetails(request, authRequest);
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |         return this.getAuthenticationManager().authenticate(authRequest);
 |  | 
 | 
												
													
														
															|  |     }
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |     /**
 |  | 
 | 
												
													
														
															|  |      * 获取手机号
 |  | 
 | 
												
													
														
															|  |      */
 |  | 
 | 
												
													
														
															|  |     protected String obtainMobile(HttpServletRequest request) {
 |  | 
 | 
												
													
														
															|  |         return request.getParameter(mobileParameter);
 |  | 
 | 
												
													
														
															|  |     }
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |     /**
 |  | 
 | 
												
													
														
															|  |      * Provided so that subclasses may configure what is put into the
 |  | 
 | 
												
													
														
															|  |      * authentication request's details property.
 |  | 
 | 
												
													
														
															|  |      *
 |  | 
 | 
												
													
														
															|  |      * @param request     that an authentication request is being created for
 |  | 
 | 
												
													
														
															|  |      * @param authRequest the authentication request object that should have its details
 |  | 
 | 
												
													
														
															|  |      *                    set
 |  | 
 | 
												
													
														
															|  |      */
 |  | 
 | 
												
													
														
															|  |     protected void setDetails(HttpServletRequest request, SmsCodeAuthenticationToken authRequest) {
 |  | 
 | 
												
													
														
															|  |         authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
 |  | 
 | 
												
													
														
															|  |     }
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |     /**
 |  | 
 | 
												
													
														
															|  |      * Sets the parameter name which will be used to obtain the username from
 |  | 
 | 
												
													
														
															|  |      * the login request.
 |  | 
 | 
												
													
														
															|  |      *
 |  | 
 | 
												
													
														
															|  |      * @param usernameParameter the parameter name. Defaults to "username".
 |  | 
 | 
												
													
														
															|  |      */
 |  | 
 | 
												
													
														
															|  |     public void setMobileParameter(String usernameParameter) {
 |  | 
 | 
												
													
														
															|  |         Assert.hasText(usernameParameter, "Username parameter must not be empty or null");
 |  | 
 | 
												
													
														
															|  |         this.mobileParameter = usernameParameter;
 |  | 
 | 
												
													
														
															|  |     }
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |     /**
 |  | 
 | 
												
													
														
															|  |      * Defines whether only HTTP POST requests will be allowed by this filter.
 |  | 
 | 
												
													
														
															|  |      * If set to true, and an authentication request is received which is not a
 |  | 
 | 
												
													
														
															|  |      * POST request, an exception will be raised immediately and authentication
 |  | 
 | 
												
													
														
															|  |      * will not be attempted. The <tt>unsuccessfulAuthentication()</tt> method
 |  | 
 | 
												
													
														
															|  |      * will be called as if handling a failed authentication.
 |  | 
 | 
												
													
														
															|  |      * <p>
 |  | 
 | 
												
													
														
															|  |      * Defaults to <tt>true</tt> but may be overridden by subclasses.
 |  | 
 | 
												
													
														
															|  |      */
 |  | 
 | 
												
													
														
															|  |     public void setPostOnly(boolean postOnly) {
 |  | 
 | 
												
													
														
															|  |         this.postOnly = postOnly;
 |  | 
 | 
												
													
														
															|  |     }
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  |     public final String getMobileParameter() {
 |  | 
 | 
												
													
														
															|  |         return mobileParameter;
 |  | 
 | 
												
													
														
															|  |     }
 |  | 
 | 
												
													
														
															|  | 
 |  | 	// ~ Static fields/initializers
 | 
												
													
														
															|  | 
 |  | 	// =====================================================================================
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 	private String mobileParameter = SecurityProperties.mobileLoginAccountKey;
 | 
												
													
														
															|  | 
 |  | 	private boolean postOnly = true;
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 	// ~ Constructors
 | 
												
													
														
															|  | 
 |  | 	// ===================================================================================================
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 	public SmsCodeAuthenticationFilter() {
 | 
												
													
														
															|  | 
 |  | 		super(new AntPathRequestMatcher(SecurityProperties.mobileLogin, "POST"));
 | 
												
													
														
															|  | 
 |  | 	}
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 	// ~ Methods
 | 
												
													
														
															|  | 
 |  | 	// ========================================================================================================
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 	public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
 | 
												
													
														
															|  | 
 |  | 			throws AuthenticationException {
 | 
												
													
														
															|  | 
 |  | 		if (postOnly && !request.getMethod().equals("POST")) {
 | 
												
													
														
															|  | 
 |  | 			throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
 | 
												
													
														
															|  | 
 |  | 		}
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 		String mobile = obtainMobile(request);
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 		if (mobile == null) {
 | 
												
													
														
															|  | 
 |  | 			mobile = "";
 | 
												
													
														
															|  | 
 |  | 		}
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 		mobile = mobile.trim();
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 		SmsCodeAuthenticationToken authRequest = new SmsCodeAuthenticationToken(mobile);
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 		// Allow subclasses to set the "details" property
 | 
												
													
														
															|  | 
 |  | 		setDetails(request, authRequest);
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 		return this.getAuthenticationManager().authenticate(authRequest);
 | 
												
													
														
															|  | 
 |  | 	}
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 	/**
 | 
												
													
														
															|  | 
 |  | 	 * 获取手机号
 | 
												
													
														
															|  | 
 |  | 	 */
 | 
												
													
														
															|  | 
 |  | 	protected String obtainMobile(HttpServletRequest request) {
 | 
												
													
														
															|  | 
 |  | 		return request.getParameter(mobileParameter);
 | 
												
													
														
															|  | 
 |  | 	}
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 	/**
 | 
												
													
														
															|  | 
 |  | 	 * Provided so that subclasses may configure what is put into the
 | 
												
													
														
															|  | 
 |  | 	 * authentication request's details property.
 | 
												
													
														
															|  | 
 |  | 	 *
 | 
												
													
														
															|  | 
 |  | 	 * @param request
 | 
												
													
														
															|  | 
 |  | 	 *            that an authentication request is being created for
 | 
												
													
														
															|  | 
 |  | 	 * @param authRequest
 | 
												
													
														
															|  | 
 |  | 	 *            the authentication request object that should have its details
 | 
												
													
														
															|  | 
 |  | 	 *            set
 | 
												
													
														
															|  | 
 |  | 	 */
 | 
												
													
														
															|  | 
 |  | 	protected void setDetails(HttpServletRequest request, SmsCodeAuthenticationToken authRequest) {
 | 
												
													
														
															|  | 
 |  | 		authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
 | 
												
													
														
															|  | 
 |  | 	}
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 	/**
 | 
												
													
														
															|  | 
 |  | 	 * Sets the parameter name which will be used to obtain the username from
 | 
												
													
														
															|  | 
 |  | 	 * the login request.
 | 
												
													
														
															|  | 
 |  | 	 *
 | 
												
													
														
															|  | 
 |  | 	 * @param usernameParameter
 | 
												
													
														
															|  | 
 |  | 	 *            the parameter name. Defaults to "username".
 | 
												
													
														
															|  | 
 |  | 	 */
 | 
												
													
														
															|  | 
 |  | 	public void setMobileParameter(String usernameParameter) {
 | 
												
													
														
															|  | 
 |  | 		Assert.hasText(usernameParameter, "Username parameter must not be empty or null");
 | 
												
													
														
															|  | 
 |  | 		this.mobileParameter = usernameParameter;
 | 
												
													
														
															|  | 
 |  | 	}
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 	/**
 | 
												
													
														
															|  | 
 |  | 	 * Defines whether only HTTP POST requests will be allowed by this filter.
 | 
												
													
														
															|  | 
 |  | 	 * If set to true, and an authentication request is received which is not a
 | 
												
													
														
															|  | 
 |  | 	 * POST request, an exception will be raised immediately and authentication
 | 
												
													
														
															|  | 
 |  | 	 * will not be attempted. The <tt>unsuccessfulAuthentication()</tt> method
 | 
												
													
														
															|  | 
 |  | 	 * will be called as if handling a failed authentication.
 | 
												
													
														
															|  | 
 |  | 	 * <p>
 | 
												
													
														
															|  | 
 |  | 	 * Defaults to <tt>true</tt> but may be overridden by subclasses.
 | 
												
													
														
															|  | 
 |  | 	 */
 | 
												
													
														
															|  | 
 |  | 	public void setPostOnly(boolean postOnly) {
 | 
												
													
														
															|  | 
 |  | 		this.postOnly = postOnly;
 | 
												
													
														
															|  | 
 |  | 	}
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | 	public final String getMobileParameter() {
 | 
												
													
														
															|  | 
 |  | 		return mobileParameter;
 | 
												
													
														
															|  | 
 |  | 	}
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | }
 |  | }
 |