SpringSecurity 验证码检查

版权声明:转载请随意! https://blog.csdn.net/qq_41723615/article/details/89517085

在正常的用户登录系统环境下,都应该提供验证码功能。

将验证码程序文件拷贝进项目中。

但是在spring安全框架的设计之中没有考虑到验证码的情况。

一、自定义链处理——验证码检查

为了保证可以使用验证码(不是为验证码准备的),那么可以借用用户名密码的验证工具完成,专门提供了:

范例:定义一个可以进行验证码检查的过滤器

package jcn;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.security.authentication.AuthenticationServiceException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

public class ValidateLoginFilter extends UsernamePasswordAuthenticationFilter {

	@Override
	public Authentication attemptAuthentication(HttpServletRequest request,
			HttpServletResponse response) throws AuthenticationException {
		String code = request.getParameter("code");
		String rand = (String) request.getSession().getAttribute("rank");
		//此处指的是找到特定参数的信息,都可以在此处验证
		String username = super.obtainUsername(request).trim();
		String password = super.obtainPassword(request).trim();
		System.out.println("【用户名】username:" + username);
		System.out.println("【密    码】password:" + password);
		if (code != null && rand.equalsIgnoreCase(code)) {//验证码正确
			UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
			return super.getAuthenticationManager().authenticate(token);
		}else {
			//如果有需要也可以继续判断用户名和密码的情况
			throw new AuthenticationServiceException("验证码不正确");
		}
	}
}

既然是要进行链处理操作,那么就必须考虑到登录成功与登录失败所能够带来的结果。

配置applicationContext.xml文件:

准备好登录成功或失败的跳转路径:

<!-- 配置登录成功后的页面,跳转到列表页 -->
<bean id="loginSuccess" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
	<property name="defaultTargetUrl" value="/pages/back/message/message_list.action"/>
</bean>
<!-- 配置登录失败后的跳转页面 -->
<bean id="loginFailure" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
	<property name="defaultFailureUrl" value="/login.jsp?error=1"/>
</bean>

更改登录验证管理器,保留登录页和登录路径。

定义一个负责所有操作的链的连接bean。

<bean id="validateFilter" class="jcn.ValidateLoginFilter">
	<property name="authenticationSuccessHandler" ref="loginSuccess"/>
	<property name="authenticationFailureHandler" ref="loginFailure"/>
	<property name="authenticationManager" ref="authenticationManager"/>
</bean>

最终所有的错误信息都会交由login.jsp页面负责,所以在这个页面里面需要进行错误信息的输出。

验证码检查也可以通过异步验证判断是否正确。

猜你喜欢

转载自blog.csdn.net/qq_41723615/article/details/89517085
今日推荐