简介

在spring security的内置login处理是无法满足要求的,需要自己进行各种定制。这里介绍login中实现验证码的实现。

实现方法

可以有三种方法可以实现验证码的功能

第一种

自定义一个filter,放在SpringSecurity过滤器之前,在用户登录的时候会先经过这个filter,然后在这个filter中实现对验证码进行验证的功能,这种方法不推荐,因为它已经脱离了SpringSecurity

第二种

自定义一个filter让它继承自UsernamePasswordAuthenticationFilter,然后重写attemptAuthentication方法在这个方法中实现验证码的功能,如果验证码错误就抛出一个继承自AuthenticationException的验证吗错误的异常比如(CaptchaException),然后这个异常就会被SpringSecurity捕获到并将异常信息返回到前台,这种实现起来比较简单。

@Override
public Authentication attemptAuthentication(HttpServletRequest request,  HttpServletResponse response) throws AuthenticationException {  String requestCaptcha = request.getParameter(this.getCaptchaFieldName());  String genCaptcha = (String)request.getSession().getAttribute("code");  logger.info("开始校验验证码,生成的验证码为:"+genCaptcha+" ,输入的验证码为:"+requestCaptcha);  if( !genCaptcha.equals(requestCaptcha)){  throw new CaptchaException(  this.messageSource.getMessage("AbstractUserDetailsAuthenticationProvider.badCaptcha",null,"Default",null));  }  return super.attemptAuthentication(request, response);
}  

接着在配置文件中配置:

<bean id="loginFilter" class="com.zrhis.system.security.DefaultUsernamePasswordAuthenticationFilter">  <property name="authenticationManager"  ref="authenticationManager"></property>  <property name="authenticationSuccessHandler">  <bean class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">  <property name="defaultTargetUrl" value="/index.jsp"></property>  </bean>  </property>  <property name="authenticationFailureHandler">  <bean class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">  <property name="defaultFailureUrl" value="/login.jsp"></property>  </bean>  </property>
</bean>  

最后在http中加入custom-filter配置,将这个filter放在SpringSecurity的FORM_LOGIN_FILTER之前.

<custom-filter ref="loginFilter" before="FORM_LOGIN_FILTER"/>  

第三种

直接替换掉SpringSecurity的UsernamePasswordAuthenticationFilter,这种比较复杂,但是更为合理,也是我现在正在用的。
如果用这种方法那么http 中的auto-config就必须去掉,而form-login配置也必须去掉,因为这个不需要了,里面的属性都需要我们自行注入。

首先需要创建并配置一个login.jsp作为登录页面EntryPoint

<bean id="authenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">  <property name="loginFormUrl" value="/login.jsp" />
</bean>  

然后在http中配置下

<sec:http access-decision-manager-ref="accessDecisionManager"  entry-point-ref="authenticationEntryPoint">  

然后我们来写CaptchaAuthenticationFilter,同样需要继承自UsernamePasswordAuthenticationFilter

public class CaptchaAuthenticationFilter extends UsernamePasswordAuthenticationFilter{  public static final String SPRING_SECURITY_FORM_CAPTCHA_KEY = "j_captcha";  public static final String SESSION_GENERATED_CAPTCHA_KEY = Constant.SESSION_GENERATED_CAPTCHA_KEY;  private String captchaParameter = SPRING_SECURITY_FORM_CAPTCHA_KEY;  public Authentication attemptAuthentication(HttpServletRequest request,  HttpServletResponse response) throws AuthenticationException {  String genCode = this.obtainGeneratedCaptcha(request);  String inputCode = this.obtainCaptcha(request);  if(genCode == null)  throw new CaptchaException(this.messages.getMessage("LoginAuthentication.captchaInvalid"));  if(!genCode.equalsIgnoreCase(inputCode)){  throw new CaptchaException(this.messages.getMessage("LoginAuthentication.captchaNotEquals"));  }  return super.attemptAuthentication(request, response);  }  protected String obtainCaptcha(HttpServletRequest request){  return request.getParameter(this.captchaParameter);  }  protected String obtainGeneratedCaptcha (HttpServletRequest request){  return (String)request.getSession().getAttribute(SESSION_GENERATED_CAPTCHA_KEY);  }  }  

在配置文件中配置CaptchaAuthenticationFilter

<bean id="captchaAuthenticaionFilter" class="com.zrhis.system.security.CaptchaAuthenticationFilter">  <property name="authenticationManager" ref="authenticationManager" />  <property name="authenticationFailureHandler" ref="authenticationFailureHandler" />  <property name="authenticationSuccessHandler" ref="authenticationSuccessHandler" />  <property name="filterProcessesUrl" value="/login.do" />
</bean>  <bean id="authenticationSuccessHandler" class="com.zrhis.system.security.SimpleLoginSuccessHandler">  <property name="defaultTargetUrl" value="/WEB-INF/app.jsp"></property>  <property name="forwardToDestination" value="true"></property>
</bean>
<bean id="authenticationFailureHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">  <property name="defaultFailureUrl" value="/login.jsp" />
</bean>  

从配置文件中就可以看出来authenticationManager、authenticationFailureHandler、authenticationSuccessHandler、filterProcessesUrl等都需要我们自行注入了。
filterProcessesUrl定义的是登录验证的地址,默认的是j_spring_security_check这里我们改成login.do

authenticationSuccessHandler中的defaultTargetUrl定义的是登录成功后跳转到的页面

authenticationFailureHandler中的defaultTargetUrl定义的是登录失败后跳转到的页面

我们的首页app.jsp在/WEB-INF下所以需要使用服务器跳转,所以需要将forwardToDestination设为true,因为客户端跳转是不能直接访问WEB-INF下的内容的。

最后在http中将FORM_LOGIN_FILTER替换掉,最终http中完整的配置就变成了下面的内容

<sec:http access-decision-manager-ref="accessDecisionManager"  entry-point-ref="authenticationEntryPoint">  <sec:access-denied-handler ref="accessDeniedHandler"/>  <sec:session-management invalid-session-url="/login.jsp" />  <sec:custom-filter ref="filterSecurityInterceptor" before="FILTER_SECURITY_INTERCEPTOR"/>  <sec:custom-filter ref="captchaAuthenticaionFilter" position="FORM_LOGIN_FILTER"/>
</sec:http>  

custom-filter中before是在这个filter之前,after是之后,position是替换。

Spring Security-- 验证码功能的实现相关推荐

  1. spring security 验证码

    一.jsp和jar包 <img src="/open/validateImg.html" οnclick="this.src ='/open/validateImg ...

  2. Spring Security系列教程18--会话管理之防御固定会话攻击

    前言 在前面几个章节中,一一哥 带各位学习了如何实现基于数据库进行认证授权,如何给登录界面添加图形验证码,如何进行自动登录和注销登录,那么Spring Security的功能难道只有这些吗?肯定不是的 ...

  3. 【Spring】Spring Security介绍及其入门案例

    文章目录 前言 1. SpringSecurity 框架简介 1.1 概要 1.2 历史 1.3 同款产品对比 1.3.1 Spring Security 1.3.2 Shiro 1.4 模块划分 2 ...

  4. 八、springboot整合Spring Security

    springboot整合Spring Security 简介 Spring Security是一个功能强大且可高度自定义的身份验证和访问控制框架.它是保护基于Spring的应用程序的事实标准. Spr ...

  5. springboot2 war页面放在那_Spring Boot2 系列教程(三十三)整合 Spring Security

    Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展了多年了,但是使用的并不多,安全管理 ...

  6. 手把手带你入门 Spring Security!

    Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展了多年了,但是使用的并不多,安全管理 ...

  7. springboot 访问html_Spring Boot中使用Spring Security进行安全控制

    我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache ...

  8. Java认证授权框架Spring Security介绍

    Spring Security 是一个非常强大的身份验证和授权控制框架.为了满足企业项目的不同需求,它提供了很多定制化开发的解决方案,通过简单的调整配置,就能为我们的应用提供一套可靠的安全保障.本节课 ...

  9. Spring Security 基本介绍,初窥路径

    Spring Security 基本介绍和环境搭建 实验介绍 Spring Security 是一个非常强大的身份验证和授权控制框架.为了满足企业项目的不同需求,它提供了很多定制化开发的解决方案,通过 ...

  10. Spring Boot中使用Spring Security进行安全控制

    我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache ...

最新文章

  1. tasklist命令参数应用详细图解
  2. 《后浪》刷屏力图破壁二次元,B站还有哪些短板?
  3. rpm升级时spec文件执行的流程
  4. mysql db 复制_MySQL管理工具MySQL Utilities — mysqldbcopy(6)
  5. vins中imu融合_VINS-Mono代码分析与总结(最终版)
  6. tensorflow 学习资料汇总
  7. 【java异常】No enum constant org.apache.ibatis.type.JdbcType.number
  8. 【管理心得之二十一】管得少就是管得好
  9. 制作Makefile中 ** missing separator 错误解决
  10. python程序设计基础教程慕课版课后题答案_Python语言程序设计基础
  11. 快码加编——代码生成神器
  12. MYSQL数据库学习总结
  13. 颜色透明度百分比对应8位颜色值
  14. openstack ice自定义调度算法项目详解(horizon、novaclient、api、scheduler、db、自定义数据库)
  15. pytorch快速上手(10)-----netron查看神经网络结构图
  16. Python学习手册 - 基础知识汇总(精简版)
  17. 求最大连续区间和的几种方法
  18. iconv-lite,JS字符串编解码工具
  19. PySCENIC(二):pyscenic单细胞转录组转录因子分析
  20. STM32笔记 (七)中断系统与NVIC嵌套向量中断控制器

热门文章

  1. Oracle在开源Mission Control后将其开发团队解散
  2. MySQL远程工具链接报错—1130
  3. html中的div span和frameset框架标签
  4. (NO.00004)iOS实现打砖块游戏(八):游戏中小球与砖块的碰撞
  5. MySQL存储过程中的3种循环
  6. IntelliJ idea 中使用Git
  7. 使用Robolectric对android程序实现自动化测试
  8. 解决eclipse和myeclipse不能编译项目的问题
  9. python 爬取企业注册信息_python爬取企业名录
  10. php做通讯录界面,PHP 制作通讯录(三)