验证用户后主要有这样两种走向,一种是验证失败,一种是验证成功,验证失败后应该如何处理呢,验证成功又该如何处理呢?
验证失败的处理需要实现AuthenticationFailureHandler接口,我的前台用户认证失败的处理是这样的
package com.template.security.authentication.handler;
import com.template.security.shared.DirectUrlResolver;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 12-11-9
* Time: 下午11:20
*/
public class MultipleAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
private List<DirectUrlResolver> resolvers = new ArrayList<DirectUrlResolver>();
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
for (DirectUrlResolver resolver : resolvers) {
if (resolver.support(request)) {
String directUrl = resolver.directUrl();
setDefaultFailureUrl(directUrl);
}
}
super.onAuthenticationFailure(request, response, exception);
}
public void setResolvers(List<DirectUrlResolver> resolvers) {
this.resolvers = resolvers;
}
}
验证成功的处理需要实现AuthenticationSuccessHandler接口,我的后台验证成功处理是这样的
package com.template.security.authentication.handler;
import com.template.security.shared.DirectUrlResolver;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 12-11-9
* Time: 下午11:20
*/
public class MultipleAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
private List<DirectUrlResolver> resolvers = new ArrayList<DirectUrlResolver>();
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
for (DirectUrlResolver resolver : resolvers) {
if (resolver.support(request)) {
String directUrl = resolver.directUrl();
setDefaultTargetUrl(directUrl);
}
}
super.onAuthenticationSuccess(request, response, authentication);
}
public void setResolvers(List<DirectUrlResolver> resolvers) {
this.resolvers = resolvers;
}
}
不论是前台验证成功还是后台验证成功,前台验证失败还是后台验证失败我都有不同的处理,前台验证成功导向前台验证成功界面,后台验证成功导向后台验证成功界面, 前台验证失败导向前台登录界面, 后台验证失败导向后台登录界面,所以这里我使用了前面我书写的一个通用接口,也就是DirectUrlResolver。来看看验证处理成功或失败的配置信息。
<beans:bean id="multipleAuthenticationSuccessHandler" class="com.template.security.authentication.handler.MultipleAuthenticationSuccessHandler"> <beans:property name="alwaysUseDefaultTargetUrl" value="true"/> <beans:property name="resolvers"> <beans:list> <beans:ref bean="backendAuthenticationSuccessUrlResolver"/> <beans:ref bean="forendAuthenticationSuccessUrlResolver"/> </beans:list> </beans:property> </beans:bean> <beans:bean id="backendAuthenticationSuccessUrlResolver" class="com.template.security.shared.RequestParameterDirectUrlResolver"> <beans:property name="parameterName" value="token"/> <beans:property name="pattern" value="backend"/> <beans:property name="directUrl" value="/backend/login/success"/> </beans:bean> <beans:bean id="forendAuthenticationSuccessUrlResolver" class="com.template.security.shared.RequestParameterDirectUrlResolver"> <beans:property name="parameterName" value="token"/> <beans:property name="pattern" value="forend"/> <beans:property name="directUrl" value="/forend/login/success"/> </beans:bean> <beans:bean id="multipleAuthenticationFailureHandler" class="com.template.security.authentication.handler.MultipleAuthenticationFailureHandler"> <beans:property name="resolvers"> <beans:list> <beans:ref bean="backendAuthenticationFailureUrlResolver"/> <beans:ref bean="forendAuthenticationFailureUrlResolver"/> </beans:list> </beans:property> </beans:bean> <beans:bean id="backendAuthenticationFailureUrlResolver" class="com.template.security.shared.RequestParameterDirectUrlResolver"> <beans:property name="parameterName" value="token"/> <beans:property name="pattern" value="backend"/> <beans:property name="directUrl" value="/backend/login?error=1"/> </beans:bean> <beans:bean id="forendAuthenticationFailureUrlResolver" class="com.template.security.shared.RequestParameterDirectUrlResolver"> <beans:property name="parameterName" value="token"/> <beans:property name="pattern" value="forend"/> <beans:property name="directUrl" value="/forend/login?error=1"/> </beans:bean>
这里还需要将相应的验证Handler注入到前讲的认证处理Filter中。