security的登录参数验证主要是经过UsernamePasswordAuthenticationFilter过滤器
所以我们自己写个新的实现类类继承UsernamePasswordAuthenticationFilter,验证码工具我是使用jcaptcha,相信大家对这个也不会感觉陌生吧,至于网上也有很多这样的例子来演示如何扩展了
先来写个实现类继承UsernamePasswordAuthenticationFilter
- /**
- * 重载SECURITY3的UsernamePasswordAuthenticationFilter的attemptAuthentication,
- * obtainUsername,obtainPassword方法(完善逻辑) 增加验证码校验模块 添加验证码属性 添加验证码功能开关属性
- *
- * @author shadow
- * @email 124010356@qq.com
- * @create 2012.04.28
- */
- public class UsernamePasswordAuthenticationExtendFilter extends
- UsernamePasswordAuthenticationFilter {
- // 验证码字段
- private String validateCodeParameter = "validateCode";
- // 是否开启验证码功能
- private boolean openValidateCode = false;
- @Override
- public Authentication attemptAuthentication(HttpServletRequest request,
- HttpServletResponse response) throws AuthenticationException {
- // 只接受POST方式传递的数据
- if (!"POST".equals(request.getMethod()))
- throw new MethodErrorException("不支持非POST方式的请求!");
- // 开启验证码功能的情况
- if (isOpenValidateCode())
- checkValidateCode(request);
- // 获取Username和Password
- String username = obtainUsername(request);
- String password = obtainPassword(request);
- // UsernamePasswordAuthenticationToken实现Authentication校验
- UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
- username, password);
- // 允许子类设置详细属性
- setDetails(request, authRequest);
- // 运行UserDetailsService的loadUserByUsername 再次封装Authentication
- return this.getAuthenticationManager().authenticate(authRequest);
- }
- // 匹对验证码的正确性
- public void checkValidateCode(HttpServletRequest request) {
- String jcaptchaCode = obtainValidateCodeParameter(request);
- if (null == jcaptchaCode)
- throw new ValidateCodeException("验证码超时,请重新获取!");
- boolean b = CaptchaServiceSingleton.getInstance()
- .validateResponseForID(request.getSession().getId(),
- jcaptchaCode);
- if (!b)
- throw new ValidateCodeException("验证码不正确,请重新输入!");
- }
- public String obtainValidateCodeParameter(HttpServletRequest request) {
- Object obj = request.getParameter(getValidateCodeParameter());
- return null == obj ? "" : obj.toString().trim();
- }
- @Override
- protected String obtainUsername(HttpServletRequest request) {
- Object obj = request.getParameter(getUsernameParameter());
- return null == obj ? "" : obj.toString().trim();
- }
- @Override
- protected String obtainPassword(HttpServletRequest request) {
- Object obj = request.getParameter(getPasswordParameter());
- return null == obj ? "" : obj.toString().trim();
- }
- public String getValidateCodeParameter() {
- return validateCodeParameter;
- }
- public void setValidateCodeParameter(String validateCodeParameter) {
- this.validateCodeParameter = validateCodeParameter;
- }
- public boolean isOpenValidateCode() {
- return openValidateCode;
- }
- public void setOpenValidateCode(boolean openValidateCode) {
- this.openValidateCode = openValidateCode;
- }
- }
很明显我们在获取username跟password之前执行一个checkValidateCode()的方法,这里就是先比较验证码,如果失败就直接抛出ValidateCodeException,这个异常自己定义个,
只要继承AuthenticationException就可以了
校验成功就直接往下执行比较username,password,然后配置xml的时候class的指向就用自己新的filter,过滤链中使用新 的filter替换掉UsernamePasswordAuthenticationFilter实现类的位置,下面是我自己的xml配置
过滤链里的serverCustomUsernamePasswordAuthenticationFilter实现换成是我们自己刚写的实现类,至于com.shadow.security.handler.LoginSuccessHandler和
com.shadow.security.handler.LoginFailureHandler这里自己实现一个AuthenticationSuccessHandler接口里面逻辑根据项目需求来设计
- <!-- 登录认证过滤器-->
- <bean id="usernamePasswordAuthenticationFilter"
- class="com.shadow.security.service.UsernamePasswordAuthenticationExtendFilter">
- <property name="authenticationManager"
- ref="authenticationManager" />
- <property name="sessionAuthenticationStrategy"
- ref="concurrentSessionControlStrategy" />
- <property name="usernameParameter" value="username" />
- <property name="passwordParameter" value="password" />
- <property name="validateCodeParameter" value="validateCode" />
- <property name="openValidateCode" value="true" />
- <property name="filterProcessesUrl" value="/login" />
- <property name="rememberMeServices" ref="rememberMeServices" />
- <property name="authenticationSuccessHandler">
- <bean
- class="com.shadow.security.handler.LoginSuccessHandler">
- <property name="indexUrl" value="/index.jsp" />
- </bean>
- </property>
- <property name="authenticationFailureHandler">
- <bean
- class="com.shadow.security.handler.LoginFailureHandler" />
- </property>
- </bean>
至于其他的依赖属性注入就自己根据项目来添加吧,这里就不详细说明了
相关推荐
总结来说,Spring Security 3.1的验证码自定义登录涉及验证码生成、自定义AuthenticationProvider、配置Spring Security以及可能的过滤器链扩展。这一过程旨在提升系统安全性,防止恶意登录,同时也需要考虑到用户...
在实现集成登录认证组件时,我们需要了解OAuth2.0认证体系、SpringBoot、SpringSecurity以及Spring Cloud等相关知识。同时,我们还需要了解如何定义拦截器、如何在拦截的通知进行预处理、如何在UserDetailService....
"Spring Security实现验证码登录功能" Spring Security是Java应用程序安全性框架,广泛应用于Web应用程序的身份验证、授权和访问控制。验证码登录功能是Spring Security中的一个重要组件,主要用于防止自动化程序...
Spring Security 默认是账号和密码登录,现在是对 Spring Security 进行扩展,来实现短信验证码方式登录。 SpringBoot 集成 Spring Security短信验证码登录【完整源码+数据库】
SpringSecurity的强大在于它的灵活性和扩展性,你可以根据实际需求调整验证码的生成方式和验证逻辑,甚至与其他安全策略结合,如双因素认证(2FA)。学习并掌握SpringSecurity的验证码集成,将有助于提升你的Web应用...
Spring Security 默认是账号和密码登录,现在是对 Spring Security 进行扩展,来实现短信验证码方式登录。 SpringBoot 集成 Spring Security短信验证码登录【完整源码+数据库】
在这个"struts2+spring3验证码登录实例"中,验证码功能是一个重要的安全措施,它可以防止恶意的自动登录尝试或机器人攻击。验证码通常由一串随机生成的字符或数字组成,用户需要在输入框中正确输入才能完成登录。...
在本项目中,我们主要探讨的是如何利用Spring MVC和Spring Security框架构建一个基本的无数据库登录系统。Spring MVC是Spring框架的一部分,用于处理Web应用程序的请求-响应模型,而Spring Security则是一个强大的...
- **扩展性与定制化**:Spring Security的设计允许开发者根据自己的需求对其进行扩展或定制,例如可以通过自定义AuthenticationProvider实现特定的认证逻辑。 3. **配置与部署** - **XML配置**:本书详细介绍了...
在本项目中,我们主要关注的是SpringBoot 2.7版本与多个技术的深度整合,包括Spring Security、JWT(JSON Web Token)、Redis缓存以及MySQL数据库,并利用MyBatis作为持久层框架。以下是对这些技术及其整合应用的...
SpringSecurity提供了丰富的API和扩展点,使得我们能够根据项目需求灵活定制安全策略。 通过以上介绍,我们可以看到SpringSecurity在实现安全登录和身份验证方面提供了全面的支持。结合图形验证码、记住我功能以及...
Spring Security利用IoC和AOP特性,使得安全控制变得简单且可扩展。 要实现图形验证码,我们可以按照以下步骤进行: 1. **设计验证码类**: 创建一个`ImageCode`类,用于存储验证码的图像、验证码文本以及验证码...
在Spring Security中,我们可以扩展`AuthenticationProvider`,并在其中实现发送和验证短信验证码的逻辑。通常,这会涉及到与第三方短信服务商的API集成。用户提交手机号和验证码后,系统会校验验证码的正确性,只有...
- 随着MFA的普及,Spring Security 5.1可能会支持多种MFA方案,如短信验证码、生物识别等,以提升用户账户的安全性。 10. **API安全**: - 对于RESTful API的保护,Spring Security 5.1可能提供了更好的支持,...
2. **手机号登录**:为了适应移动互联网的需求,Spring Security可以通过扩展实现短信验证码或直接使用手机号作为身份验证的凭证。这通常涉及到与短信服务提供商的集成,以及对手机号的验证逻辑。 3. **邮箱登录**...
### SpringSecurity企业级认证全套开发资源解析 #### 一、Spring Security概述与核心特性 Spring Security 是一个功能强大且高度可定制的身份验证和安全(ACL)框架。它为基于Spring的应用程序提供了声明式方法的...
3. **记住我功能**:通过RememberMe服务,Spring Security 可以让用户在一段时间内免于重新登录。 4. **异常处理**:Spring Security 提供了一套自定义的异常体系,方便处理各种安全异常。 **五、最佳实践** 1. *...
Spring Security 的核心设计允许开发者进行深度定制,你可以扩展它的核心组件,如访问决策管理器、认证管理器和权限评估器,以满足特定的业务需求。 总结,Spring Security 是一个功能丰富的安全框架,可以帮助...
在Spring Security 4中,如果你需要添加验证码功能来增强用户登录的安全性,可以通过自定义组件来实现。以下是一个具体的步骤介绍: 1. **自定义入口点(EntryPoint)**: 通常,当用户尝试访问受保护的资源但未...
SpringBoot结合Spring Security实现登录认证是企业级应用开发中常见的安全框架组合,它们为Web应用程序提供了强大的安全性。本文将深入探讨这两个技术的核心概念、配置以及如何整合以实现用户登录认证功能。 ...