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容器详细解析

    Java容器详细解析 在Java中,容器是一种可以存储和检索对象的数据结构。Java提供了各种类型的容器,包括List、Set、Map等等。本文将通过详细解析Java容器,让您了解Java中各种容器类型的使用方法和优缺点。 List容器 List容器是一种有序的容器,允许元素重复。在Java中,常用的List容器有ArrayList和LinkedList。 …

    Java 2023年5月26日
    00
  • springData使用QueryDsl的示例代码

    让我来详细讲解一下“Spring Data 使用 Querydsl 的示例代码”的完整攻略。 简介 Querydsl 是一个基于 Java 类型化查询的框架,使得编写类型安全、易于理解的查询变得容易。 Spring Data 是 Spring 框架的一部分,通过提供抽象化的数据存储层来简化对数据访问的开发。Spring Data Querydsl 是 Spr…

    Java 2023年5月20日
    00
  • Sprint Boot @Service使用方法详解

    @Service是Spring Boot中的一个注解,它用于标记一个类为服务类。在使用Spring Boot开发应用程序时,@Service是非常有用的。本文将详细介绍@Service的作用和使用,并提供两个示例说明。 @Service的作用 @Service的作用是标记一个类为服务类。服务类是指实现业务逻辑的类。使用@Service注解标记的类将被Spri…

    Java 2023年5月5日
    00
  • Java中StringBuilder字符串类型的操作方法及API整理

    Java中StringBuilder字符串类型的操作方法及API整理 概述 StringBuilder是Java中常用的字符串类,可以在原字符串的基础上进行修改操作,提高程序效率。比String更加灵活,更加高效。 常用方法 以下是常用的StringBuilder方法及其使用方法。 构造函数 StringBuilder():无参构造函数,创建一个16个字符长…

    Java 2023年5月20日
    00
  • JS实现上传文件显示进度条

    JS实现上传文件显示进度条的完整攻略: HTML部分 首先要有一个文件上传表单,可通过以下代码添加: <form name="form1" method="post" enctype="multipart/form-data" action="upload.php">…

    Java 2023年6月16日
    00
  • Java SpringBoot 中的操作事务

    Java Spring Boot中的操作事务 在Java Spring Boot中,事务是一种非常重要的机制,它可以确保数据库操作的一致性和完整性。本文将介绍Java Spring Boot中的操作事务的完整攻略,包括事务的基本概念、事务的使用方法、事务的传播机制和事务的示例。 1. 事务的基本概念 事务是指一组数据库操作,这些操作要么全部执行成功,要么全部…

    Java 2023年5月14日
    00
  • SpringMVC中的handlerMappings对象用法

    介绍SpringMVC中的handlerMappings对象用法的完整攻略如下: 什么是handlerMappings对象 handlerMappings对象是Spring MVC中的一个重要组件,负责将请求映射到对应的控制器处理器(handler)上。它是一个接口,定义了获取HandlerExecutionChain对象的方法。 HandlerExecut…

    Java 2023年6月15日
    00
  • Java Web程序实现返回JSON字符串的方法总结

    下面就是针对“Java Web程序实现返回JSON字符串的方法总结”的完整攻略: 1.使用Jackson库 在Java Web程序中,可以使用Jackson库将Java对象转换为JSON字符串。使用Jackson库需要添加依赖,Maven中添加如下依赖: <dependency> <groupId>com.fasterxml.jack…

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