SpringSecurity添加图形验证码认证实现

下面我来为你讲解SpringSecurity添加图形验证码认证实现的完整攻略。

1. 引入依赖

pom.xml文件中添加以下依赖:

<!--验证码依赖-->
<dependency>
    <groupId>com.github.axolo</groupId>
    <artifactId>image-verify-code-spring-boot-starter</artifactId>
    <version>1.0.4</version>
</dependency>

2. 配置验证码

application.properties文件中添加以下配置:

verify-code.enabled=true  # 启用验证码
verify-code.url-patterns=/login  # 验证码拦截的地址
verify-code.image.width=220  # 验证码图片宽度
verify-code.image.height=50  # 验证码图片高度
verify-code.number.chars=4   # 验证码字符数量
verify-code.string.chars=acdefhjkmnpqrstuvwxyz2345678 # 验证码字符源

3. 实现验证码校验逻辑

在实现了UserDetailsService接口的类中添加验证方法:

public void validateVerifyCode(HttpServletRequest request) {
    VerifyCode verifyCode = (VerifyCode) request.getSession().getAttribute(VerifyCode.VERIFY_CODE);
    if (verifyCode == null) {
        throw new AuthenticationServiceException("验证码不能为空");
    }
    String inputVerifyCode = request.getParameter("code");
    if (StringUtils.isBlank(inputVerifyCode)) {
        throw new AuthenticationServiceException("验证码不能为空");
    }
    if (!inputVerifyCode.equalsIgnoreCase(verifyCode.getCode())) {
        throw new AuthenticationServiceException("验证码错误");
    }
}

4. 自定义UsernamePasswordAuthenticationFilter

继承UsernamePasswordAuthenticationFilter,重写attemptAuthentication方法,实现验证码校验逻辑:

public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
        if (request.getMethod().equals("POST")) {
            validateVerifyCode(request);
        }
        return super.attemptAuthentication(request, response);
    }
}

5. 添加过滤器链

WebSecurityConfigurerAdapter的子类中配置自定义过滤器:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.addFilterBefore(customAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
            .authorizeRequests()
            .antMatchers("/css/**", "/js/**", "/fonts/**", "/index").permitAll()
            .antMatchers("/users/**").hasRole("ADMIN")
            .and()
            .formLogin()
            .loginPage("/login").failureUrl("/login-error");
}

@Bean
public CustomAuthenticationFilter customAuthenticationFilter() throws Exception {
    CustomAuthenticationFilter filter = new CustomAuthenticationFilter();
    filter.setAuthenticationSuccessHandler(new LoginSuccessHandler());
    filter.setAuthenticationFailureHandler(new LoginFailureHandler());
    filter.setFilterProcessesUrl("/login");
    filter.setAuthenticationManager(authenticationManagerBean());
    return filter;
}

示例1

@GetMapping("/login")
public String login() {
    return "login";
}

@PostMapping("/login")
public void doLogin(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws Exception {
    String username = request.getParameter("username");
    String password = request.getParameter("password");

    try {
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
        request.getSession().setAttribute("SPRING_SECURITY_LAST_EXCEPTION", null);
        Authentication authentication = authenticationManager.authenticate(token);
        SecurityContextHolder.getContext().setAuthentication(authentication);
        session.setAttribute("user", authentication.getPrincipal());
        response.sendRedirect("/");
    } catch (AuthenticationException e) {
        request.getSession().setAttribute("SPRING_SECURITY_LAST_EXCEPTION", e);
        response.sendRedirect("/login?error");
    }
}

示例2

public class LoginSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {

    private RequestCache requestCache = new HttpSessionRequestCache();

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
        SavedRequest savedRequest = requestCache.getRequest(request, response);
        if (savedRequest == null) {
            super.onAuthenticationSuccess(request, response, authentication);
            return;
        }
        response.sendRedirect(savedRequest.getRedirectUrl());
    }
}

以上是添加图形验证码认证实现的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringSecurity添加图形验证码认证实现 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java中Controller引起的Ambiguous mapping问题及解决

    首先我们需要明确什么是Controller及Ambiguous mapping问题。 什么是Controller 在Java Web应用中,Controller是一种将请求路由到相应处理程序的设计模式。在Spring MVC框架中,Controller是处理请求的核心组件,它负责接收请求、调用处理程序并返回响应。 什么是Ambiguous mapping问题…

    Java 2023年5月25日
    00
  • Apache Shiro 使用手册(三) Shiro授权

    Shiro授权是一个非常重要的部分,它定义了谁可以访问应用程序中的哪些资源。本文将介绍如何使用Shiro进行授权。 什么是Shiro授权? Shiro授权是指确定哪些用户可以访问应用程序中的哪些资源。一般来说,授权是在通过身份验证后给定的,如果身份验证已经将用户与特定角色相关联,则可以使用角色来进行授权。此外,还可以使用基于权限的授权方式。 Shiro授权处…

    Java 2023年6月15日
    00
  • Easyui 关闭jquery-easui tab标签页前触发事件的解决方法

    如果你使用 EasyUI 来构建 Web 应用程序,你或许会遇到这样的情况:在关闭 tab 标签页前需要做一些操作,例如弹出对话框进行确认、保存数据等。那么如何实现 在关闭 EasyUI 的 Tab 标签页前触发事件呢?以下是完整的攻略步骤: 1. 绑定 onBeforeClose 事件 在使用 EasyUI Tabs 的时候,我们可以通过绑定 onBefo…

    Java 2023年6月15日
    00
  • js将键值对字符串转为json字符串的方法

    将键值对字符串转为JSON字符串的方法,可以使用JSON.parse()函数来实现。下面给出详细的攻略。 1. 确认键值对字符串的格式 在转换之前,需要确保键值对字符串的格式正确。格式应该是键值对之间使用逗号分隔,键与值之间使用冒号分隔,整个字符串包裹在一对花括号内。 例如,以下的字符串是合法的键值对字符串: {"name": &quot…

    Java 2023年5月26日
    00
  • python读取json文件并将数据插入到mongodb的方法

    下面是详细的Python读取JSON文件并将数据插入到MongoDB的方法攻略。 1. 在Python中读取JSON文件 要在Python中读取JSON文件,我们需要使用json模块。json模块提供了几个功能,用于将JSON数据转换为Python对象和将Python对象转换为JSON数据。 以下是读取JSON文件的示例代码: import json # 读…

    Java 2023年5月26日
    00
  • spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)

    Spring Boot中增加表单验证hibernate-validator并在Freemarker模板中显示错误信息 在Spring Boot应用程序中,我们经常需要对表单数据进行验证,以确保数据的有效性和完整性。为了实现表单验证,我们可以使用hibernate-validator框架,并将错误信息显示在Freemarker模板中。在本文中,我们将介绍如何在…

    Java 2023年5月18日
    00
  • 完整java开发中JDBC连接数据库代码和步骤

    当进行Java开发中需要连接数据库进行数据操作时,我们可以使用JDBC来完成这个任务。下面详细介绍完整的JDBC连接数据库代码和步骤,这里以MySQL数据库和Oracle数据库为例。 JDBC连接MySQL数据库 步骤一:导入JDBC驱动 要连接MySQL数据库,我们需要使用MySQL JDBC驱动程序。将JDBC驱动程序的JAR文件添加到classpath…

    Java 2023年5月19日
    00
  • SpringBoot DataSource数据源实现自动配置流程详解

    这里是关于SpringBoot DataSource数据源实现自动配置流程的详细攻略: 1. SpringBoot DataSource数据源的概述 SpringBoot 数据源(DataSource)是一个非常重要的组件,它是应用程序和后端数据库之间的桥梁。DataSource 有两个关键任务:一是管理数据库连接池,以便应用可以快速、高效地访问数据库;二是…

    Java 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部