千家信息网

Spring Security添加验证码的方式有哪些

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"Spring Security添加验证码的方式有哪些",在日常操作中,相信很多人在Spring Security添加验证码的方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好
千家信息网最后更新 2026年11月02日Spring Security添加验证码的方式有哪些

这篇文章主要介绍"Spring Security添加验证码的方式有哪些",在日常操作中,相信很多人在Spring Security添加验证码的方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Spring Security添加验证码的方式有哪些"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

目录
  • 一、自定义认证逻辑

  • 二、自定义过滤器

一、自定义认证逻辑

生成验证码工具

    com.github.penggle    kaptcha    2.3.2

添加Kaptcha配置

@Configurationpublic class KaptchaConfig {    @Bean    Producer kaptcha() {        Properties properties = new Properties();        properties.setProperty("kaptcha.image.width", "150");        properties.setProperty("kaptcha.image.height", "50");        properties.setProperty("kaptcha.textproducer.char.string", "0123456789");        properties.setProperty("kaptcha.textproducer.char.length", "4");        Config config = new Config(properties);        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();        defaultKaptcha.setConfig(config);        return defaultKaptcha;    }}

生成验证码文本,放入HttpSession中

根据验证码文本生成图片 通过IO流写出到前端。

@RestControllerpublic class LoginController {    @Autowired    Producer producer;    @GetMapping("/vc.jpg")    public void getVerifyCode(HttpServletResponse resp, HttpSession session) throws IOException {        resp.setContentType("image/jpeg");        String text = producer.createText();        session.setAttribute("kaptcha", text);        BufferedImage image = producer.createImage(text);        try(ServletOutputStream out = resp.getOutputStream()) {            ImageIO.write(image, "jpg", out);        }    }    @RequestMapping("/index")    public String index() {        return "login success";    }    @RequestMapping("/hello")    public String hello() {        return "hello spring security";    }}

form表单

        登录            

登录




验证码图片地址为我们在Controller中定义的验证码接口地址。

身份认证是AuthenticationProvider的authenticate方法完成,因此验证码可以在此之前完成:

public class KaptchaAuthenticationProvider extends DaoAuthenticationProvider {    @Override    public Authentication authenticate(Authentication authentication) throws AuthenticationException {        HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();        String kaptcha = req.getParameter("kaptcha");        String sessionKaptcha = (String) req.getSession().getAttribute("kaptcha");        if (kaptcha != null && sessionKaptcha != null && kaptcha.equalsIgnoreCase(sessionKaptcha)) {            return super.authenticate(authentication);        }        throw new AuthenticationServiceException("验证码输入错误");    }}

配置AuthenticationManager:

@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {    @Bean    AuthenticationProvider kaptchaAuthenticationProvider() {        InMemoryUserDetailsManager users = new InMemoryUserDetailsManager(User.builder()                .username("xiepanapn").password("{noop}123").roles("admin").build());        KaptchaAuthenticationProvider provider = new KaptchaAuthenticationProvider();        provider.setUserDetailsService(users);        return provider;    }    @Override    @Bean    public AuthenticationManager authenticationManagerBean() throws Exception {        ProviderManager manager = new ProviderManager(kaptchaAuthenticationProvider());        return manager;    }    @Override    protected void configure(HttpSecurity http) throws Exception {        http.authorizeRequests()                .antMatchers("/vc.jpg").permitAll()                .anyRequest().authenticated()                .and()                .formLogin()                .loginPage("/mylogin.html")                .loginProcessingUrl("/doLogin")                .defaultSuccessUrl("/index.html")                .failureForwardUrl("/mylogin.html")                .usernameParameter("uname")                .passwordParameter("passwd")                .permitAll()                .and()                .csrf().disable();    }}
  1. 配置UserDetailsService提供的数据源

  2. 提供AuthenticationProvider实例并配置UserDetailsService

  3. 重写authenticationManagerBean方法提供一个自己的ProviderManager并自定义AuthenticationManager实例。

二、自定义过滤器

LoginFilter继承UsernamePasswordAuthenticationFilter 重写attemptAuthentication方法:

public class LoginFilter extends UsernamePasswordAuthenticationFilter {    @Override    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {        if (!request.getMethod().equals("POST")) {            throw new AuthenticationServiceException(                    "Authentication method not supported: " + request.getMethod());        }        String kaptcha = request.getParameter("kaptcha");        String sessionKaptcha = (String) request.getSession().getAttribute("kaptcha");        if (!StringUtils.isEmpty(kaptcha) && !StringUtils.isEmpty(sessionKaptcha) && kaptcha.equalsIgnoreCase(sessionKaptcha)) {            return super.attemptAuthentication(request, response);        }        throw new AuthenticationServiceException("验证码输入错误");    }}

在SecurityConfig中配置LoginFilter

@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {    @Override    protected void configure(AuthenticationManagerBuilder auth)            throws Exception {        auth.inMemoryAuthentication()                .withUser("javaboy")                .password("{noop}123")                .roles("admin");    }    @Override    @Bean    public AuthenticationManager authenticationManagerBean()            throws Exception {        return super.authenticationManagerBean();    }    @Bean    LoginFilter loginFilter() throws Exception {        LoginFilter loginFilter = new LoginFilter();        loginFilter.setFilterProcessesUrl("/doLogin");        loginFilter.setAuthenticationManager(authenticationManagerBean());        loginFilter.setAuthenticationSuccessHandler(new SimpleUrlAuthenticationSuccessHandler("/hello"));        loginFilter.setAuthenticationFailureHandler(new SimpleUrlAuthenticationFailureHandler("/mylogin.html"));        return loginFilter;    }    @Override    protected void configure(HttpSecurity http) throws Exception {        http.authorizeRequests()                .antMatchers("/vc.jpg").permitAll()                .anyRequest().authenticated()                .and()                .formLogin()                .loginPage("/mylogin.html")                .permitAll()                .and()                .csrf().disable();        http.addFilterAt(loginFilter(),                UsernamePasswordAuthenticationFilter.class);    }}

显然第二种比较简单

到此,关于"Spring Security添加验证码的方式有哪些"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

验证 配置 方式 方法 学习 生成 认证 图片 地址 实例 文本 更多 过滤器 逻辑 错误 帮助 登录 输入 实用 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 疫情对互联网科技公司影响 互联网扶贫科技 互联网金融 科技 互联网科技视频 互联网科技的英文 云电互联网科技 四川狮子座互联网科技 衡水科技产业互联网平台 华中科技有哪些互联网大佬 互联网企业和科技型企业 互联网科技项目计划书材料类 厦门千工互联网科技有限公司 花神(南京)互联网科技有限公司 晓花互联网科技有限公司网址 恒生互联网科技指数跳水 坤平互联网科技 河南住房之家互联网科技 广州互联网高科技取餐柜 盐城市攀科互联网科技有限公司 科技互联网专业务虚会材料 上海喔噻互联网科技有限公司 互联网科技工作委员会毛军 期待互联网科技 互联网科技作文 奇酷互联网络科技公司 互联网科技ppt模板 玖二柒互联网科技公司待遇 沐思想互联网科技有限公司 全球科技与互联网公司市值变化 山东亿川互联网科技有限责任公司
0