PhoneLoginConfigurer.java

package org.oxerr.spring.security.phone.config.annotation.web.configurers;

import org.oxerr.spring.security.phone.authentication.PhoneAuthenticationProvider;
import org.oxerr.spring.security.phone.core.userdetails.PhoneUserDetailsService;
import org.oxerr.spring.security.phone.web.authentication.PhoneAuthenticationFilter;
import org.springframework.security.config.annotation.web.HttpSecurityBuilder;
import org.springframework.security.config.annotation.web.configurers.AbstractAuthenticationFilterConfigurer;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.util.matcher.RequestMatcher;

public final class PhoneLoginConfigurer<H extends HttpSecurityBuilder<H>>
		extends
		AbstractAuthenticationFilterConfigurer<H, PhoneLoginConfigurer<H>,
		PhoneAuthenticationFilter> {

	private final PhoneUserDetailsService phoneUserDetailsService;

	public PhoneLoginConfigurer(PhoneUserDetailsService phoneUserDetailsService) {
		super(new PhoneAuthenticationFilter(), "/login/phone");
		this.phoneUserDetailsService = phoneUserDetailsService;
		numberParameter("number");
		codeParameter("code");
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void configure(H http) throws Exception {

		// Make sure the filter be registered in
		// org.springframework.security.config.annotation.web.builders.FilterComparator
		http.addFilterAfter(getAuthenticationFilter(),
				UsernamePasswordAuthenticationFilter.class);

		super.configure(http);
	}

	@Override
	public PhoneLoginConfigurer<H> loginPage(String loginPage) {
		return super.loginPage(loginPage);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void init(H http) throws Exception {
		super.init(http);

		PhoneAuthenticationProvider authenticationProvider = new PhoneAuthenticationProvider(
				phoneUserDetailsService);
		postProcess(authenticationProvider);
		http.authenticationProvider(authenticationProvider);

		initDefaultLoginFilter(http);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected RequestMatcher createLoginProcessingUrlMatcher(
			String loginProcessingUrl) {
		return new AntPathRequestMatcher(loginProcessingUrl, "POST");
	}

	private void initDefaultLoginFilter(H http) {
		DefaultLoginPageGeneratingFilter loginPageGeneratingFilter = http
				.getSharedObject(DefaultLoginPageGeneratingFilter.class);
		if (loginPageGeneratingFilter != null && !isCustomLoginPage()) {
			String loginPageUrl = loginPageGeneratingFilter.getLoginPageUrl();
			if (loginPageUrl == null) {
				loginPageGeneratingFilter.setLoginPageUrl(getLoginPage());
				loginPageGeneratingFilter.setFailureUrl(getFailureUrl());
			}
		}
	}

	public PhoneLoginConfigurer<H> numberParameter(String numberParameter) {
		getAuthenticationFilter().setNumberParameter(numberParameter);
		return this;
	}

	public PhoneLoginConfigurer<H> codeParameter(String codeParameter) {
		getAuthenticationFilter().setCodeParameter(codeParameter);
		return this;
	}

}