提交调用验证_Springboot基于SpringSecurity图片验证码登录

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

  作者 |  大嘤熊 

来源 |  urlify.cn/Q7JB3e

66套java从入门到精通实战课程分享 

在前面的简单登录验证,我们简单整合了SpringSecurity的登录,可以通过自定义设置或者从数据库中读取用户权限类。接下来我们实现一些简单的验证码相关的登录验证。

1、图片验证码登录

其实这里和最初的登录验证没啥区别,只是多了一个验证码的验证过程。我们首先需要清楚认识到SpringSecurity的整个登录认证流程80516d0e565355033eec85cfd4c94519.png

  1. Spring Security使用UsernamePasswordAuthenticationFilter过滤器来拦截用户名密码认证请求

  2. 将用户名和密码封装成一个UsernamePasswordToken对象交给AuthenticationManager处理。

  3. AuthenticationManager将挑出一个支持处理该类型Token的AuthenticationProvider(这里默认为DaoAuthenticationProvider,AuthenticationProvider的其中一个实现类)来进行认证

  4. 认证过程中DaoAuthenticationProvider将调用UserDetailService的loadUserByUsername方法来处理认证(可以自定义UserDetailService的实现类)

  5. 如果认证通过(即UsernamePasswordToken中的用户名和密码相符)则返回一个UserDetails类型对象,并将认证信息保存到Session中,认证后我们便可以通过Authentication对象获取到认证的信息了。

那么我们添加验证码验证则有如下几种思路:

1.1、登录表单提交前发送 AJAX 验证验证码

这种方式和SpringSecurity毫无关系,其实就是表单提交前先发个 HTTP 请求验证验证码。

1.2、和用户名、密码一起发送到后台,在 Springsecurity中进行验证

最开始我是采用的这种方式,这种方式也是和Spring security 结合的最紧密的方式。
首先需要清楚的是security默认只处理用户名和密码信息。所以我们需要自定义实现WebAuthenticationDetails向其中加入验证码。

public class CustomWebAuthenticationDetails extends WebAuthenticationDetails {
        private static final long serialVersionUID = 6975601077710753878L;    private final String verifyCode;    public CustomWebAuthenticationDetails(HttpServletRequest request) {
            super(request);        // verifyCode为页面中验证码的name        verifyCode = request.getParameter("verifyCode");    }    public String getVerifyCode() {
            return this.verifyCode;    }}

在这个方法中,我们将前台 form 表单中的 verifyCode 获取到,并通过 get 方法方便被调用。这样我们就在验证信息类中添加了验证码的相关信息。自定义了WebAuthenticationDetails,我i们还需要将其放入 AuthenticationDetailsSource 中来替换原本的 WebAuthenticationDetails ,因此还得实现自定义 AuthenticationDetailsSource :

@Component("authenticationDetailsSource")public class CustomAuthenticationDetailsSource implements AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> {
        @Override    public WebAuthenticationDetails buildDetails(HttpServletRequest request) {
            return new CustomWebAuthenticationDetails(request);    }}

该类内容将原本的 WebAuthenticationDetails 替换为了我们的 CustomWebAuthenticationDetails。
然后我们将 CustomAuthenticationDetailsSource 注入Spring Security中,替换掉默认的 AuthenticationDetailsSource。
修改 WebSecurityConfig,将其注入,然后在config()中使用 authenticationDetailsSource(authenticationDetailsSource)方法来指定它。

@Autowiredprivate AuthenticationDetailsSource authenticationDetailsSource;@Overrideprotected void configure(HttpSecurity http) throws Exception {                                      http...                  // 指定authenticationDetailsSource                  .authenticationDetailsSource(authenticationDetailsSource)                  ...}

至此我们通过自定义WebAuthenticationDetails和AuthenticationDetailsSource将验证码和用户名、密码一起带入了Spring Security中,下面我们需要将它取出来验证。
这里需要我们自定义AuthenticationProvider,需要注意的是,如果是我们自己实现AuthenticationProvider,那么我们就需要自己做密码校验了。

@Componentpublic class CustomAut
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值