security实现验证码andRemember-Me(上)

简介: security实现验证码andRemember-Me(上)

实现验证码



导入依赖


<!--验证码相关的依赖-->
<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>


定义验证码配置类


package Rememberme.config;
import com.google.code.kaptcha.Producer;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
/**
 * 验证码相关配置
 */
@Configuration
public class KaptchaConfig {
    @Bean
    public 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;
    }
}


定义验证码的拦截器


//自定义验证码Filter
public class kaptchaFilter extends UsernamePasswordAuthenticationFilter {
}


自定义拦截器配置类,实现UsernamePasswordAuthenticationFilter

然后设置默认的拦截器

//类似源码,定义默认值
public static final String KAPTCHA_KEY = "kaptcha";//默认值
private String kaptcha = KAPTCHA_KEY;
实现拦截器的验证方法attemptAuthentication


@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
    //1. 验证请求判断是否为post
    if (!request.getMethod().equalsIgnoreCase("post")) {
        throw new KaptchaNotMatchException("请求异常" + request.getMethod());
    }
    //2.获取验证码
    String kaptcha = request.getParameter(getKaptcha());
    String sessionKaptcha = (String) request.getSession().getAttribute("kaptcha");
    if (!ObjectUtils.isEmpty(kaptcha)
        && !ObjectUtils.isEmpty(sessionKaptcha)
        && kaptcha.equalsIgnoreCase(sessionKaptcha)) {
        //3. 返回自定义的组件
        return super.attemptAuthentication(request, response);
    }
    throw new KaptchaNotMatchException("验证码异常!");
}


自定义拦截器配置


@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public kaptchaFilter KaptchaFilter() throws Exception {
        kaptchaFilter filter = new kaptchaFilter();
        //指定处理登录
        filter.setFilterProcessesUrl("/doLogin");
        //setUsername、password....
        //指定接受拦截器的请求参数名
        filter.setKaptcha("kaptcha");
        //自定义拦截器的认证管理器
        filter.setAuthenticationManager(authenticationManagerBean());
        //指定认证成功或者失败的请求
        filter.setAuthenticationSuccessHandler((request, response, authentication) -> {
            Map<String, Object> result = new HashMap<>();
            result.put("msg", "登录成功!");
            result.put("status", "200");
            result.put("用户信息", (User) authentication.getPrincipal());
            response.setContentType("application/json;charset=UTF-8");
            String s = new ObjectMapper().writeValueAsString(result);
            response.getWriter().println(s);
        });
        filter.setAuthenticationFailureHandler((request, response, exception) -> {
            Map<String, Object> result = new HashMap<>();
            result.put("msg", "登录失败!!");
            result.put("status", "400");
            result.put("错误信息", exception.getMessage());
            response.setContentType("application/json;charset=UTF-8");
            String s = new ObjectMapper().writeValueAsString(result);
            response.getWriter().println(s);
        });
        return filter;
    }
}


注意点


//指定接受拦截器的请求参数名
filter.setKaptcha("kaptcha");
//自定义拦截器的认证管理器
filter.setAuthenticationManager(authenticationManagerBean());


将自定义的拦截器交给容器


用来将自定义AuthenticationManager在工厂中进行暴露,可以在任何位置注入

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    //用来将自定义AuthenticationManager在工厂中进行暴露,可以在任何位置注入
    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
    @Bean
    public kaptchaFilter KaptchaFilter() throws Exception {
        kaptchaFilter filter = new kaptchaFilter();
        //指定处理登录
        filter.setFilterProcessesUrl("/doLogin");
        //setUsername、password....
        //指定接受拦截器的请求参数名
        filter.setKaptcha("kaptcha");
        //自定义拦截器的认证管理器
        filter.setAuthenticationManager(authenticationManagerBean());
        //指定认证成功或者失败的请求
        filter.setAuthenticationSuccessHandler((request, response, authentication) -> {
            Map<String, Object> result = new HashMap<>();
            result.put("msg", "登录成功!");
            result.put("status", "200");
            result.put("用户信息", (User) authentication.getPrincipal());
            response.setContentType("application/json;charset=UTF-8");
            String s = new ObjectMapper().writeValueAsString(result);
            response.getWriter().println(s);
        });
        filter.setAuthenticationFailureHandler((request, response, exception) -> {
            Map<String, Object> result = new HashMap<>();
            result.put("msg", "登录失败!!");
            result.put("status", "400");
            result.put("错误信息", exception.getMessage());
            response.setContentType("application/json;charset=UTF-8");
            String s = new ObjectMapper().writeValueAsString(result);
            response.getWriter().println(s);
        });
        return filter;
    }
}


替换自己的拦截器



//替换默认拦截器
        http.addFilterAt(KaptchaFilter(), UsernamePasswordAuthenticationFilter.class);


@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
   @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .mvcMatchers("/index").permitAll()
                .mvcMatchers("/loginPages").permitAll()
                .mvcMatchers("/vc.jpg").permitAll()     //放行验证码的请求
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/loginPages")
//                .loginProcessingUrl("/doLogin")
//                .defaultSuccessUrl("/index")
//                .failureUrl("/loginPage")
//                .and()
//                .logout()
//                .logoutSuccessUrl("/index")
                .and()
                .csrf().disable();
  //替换默认拦截器
        http.addFilterAt(KaptchaFilter(), UsernamePasswordAuthenticationFilter.class);
    }
}


controller配置验证码拦截器发送的请求


@RequestMapping("/vc.jpg")
public void Kaptcha(HttpServletResponse response, HttpSession session) throws IOException {
    response.setContentType("image/png");
    String text = producer.createText();
    session.setAttribute("kaptcha", text);
    BufferedImage image = producer.createImage(text);
    ServletOutputStream stream = response.getOutputStream();
    ImageIO.write(image, "jpg", stream);
}


前端实现请求接口


验证码: <input name="kaptcha" type="text"/> <img alt="" th:src="@{/vc.jpg}"><br>


目录
相关文章
|
安全 Java 数据库
Spring Security详细讲解(JWT+SpringSecurity登入案例)
通过本篇博文,你可以详细了解Spring Security的相关概念与原理,并且掌握Spring Security的认证与授权,通过博文中的登入案例可以让自己定制去Spring Security认证授权方案。
Spring Security详细讲解(JWT+SpringSecurity登入案例)
|
安全 数据安全/隐私保护
SpringSecurity5.7+最新案例 -- 用户名密码+验证码+记住我······
根据最近一段时间的设计以及摸索,对SpringSecurity进行总结,目前security采用的是5.7+版本,和以前的版本最大的差别就是,以前创建SecurityConfig需要继承WebSecurityConfigurerAdapter,而到了5.7以后,并不推荐这种做法,查了网上一些教程,其实并不好,绝大多数用的都是老版本,所以出此文案。一些原理什么的,就不过多说明了,一般搜索资料的,其实根本不想你说什么原理 T·T。
189 0
SpringSecurity5.7+最新案例 -- 用户名密码+验证码+记住我······
|
安全 Java Spring
security实现验证码andRemember-Me(下)
security实现验证码andRemember-Me(下)
86 0
|
算法 安全 Java
Security实现密码加密处理
Security实现密码加密处理
392 0
|
存储 XML SQL
手把手教你基于 Kaptcha 验证码检验的登录
在网站实际应用过程中,为了防止网站登录接口被机器人轻易地使用,产生一些没有意义的用户数据,所以,采用验证码进行一定程度上的拦截,当然,我们采用的还是一个数字与字母结合的图片验证码形式,后续会讲到更加复杂的数字计算类型的图片验证码,请持续关注我的博客。
496 0
|
安全 前端开发 Oracle
Spring Security表单登录认证
Spring Security是一个强有力并且高度定制化的认证和访问控制框架,致力于为Java应用程序提供认证和授权。
Spring Security表单登录认证
|
缓存 JavaScript Java
web验证码的生成以及验证
web验证码的生成以及验证
277 0
web验证码的生成以及验证
|
存储 安全 Java
Spring Security系列教程14--基于自定义的认证提供器实现图形验证码
前言 在上一个章节中,一一哥 带大家实现了如何在Spring Security中添加执行自定义的过滤器,进而实现验证码校验功能。这种实现方式,只是实现验证码功能的方式之一,接下来我们再学习另一种实现方式,就是利用AuthenticationProvider来实现验证码功能,通过这个案例,我们学习如何进行自定义AuthenticationProvider。 一. 认证提供器简介 在上一章节中,我带各位利用自定义的过滤器实现了图形验证码效果,接下来我们利用另一种方式,基于自定义的认证提供器来实现图形验证码。 1. 认证提供器AuthenticationProvider 在第11章节中,壹哥 给大家
300 0
|
存储 缓存 安全
【Shiro】6、Shiro实现限制密码错误次数从而限制用户登录
我们的系统非常容易遭受攻击,被人暴力破解等,我们需要对同一账户密码错误次数进行统计,达到上限后,需要在一段时间内限制该用户登录,从而有效地保护账户密码的安全
530 0
|
存储 前端开发 安全
9-SpringSecurity:登录时的图片验证码
9-SpringSecurity:登录时的图片验证码
131 0
9-SpringSecurity:登录时的图片验证码