SpringBoot实现滑块验证码验证登陆校验功能详解

下面我将为你详细讲解“SpringBoot实现滑块验证码验证登陆校验功能”的完整攻略。

1. 概述

在本文中,我们将介绍使用SpringBoot来实现滑块验证码验证登陆校验功能的完整攻略。其中,我们使用了阿里云的滑块验证码服务和Spring Security框架来完成。

本文将分为以下几个部分:

  1. 阿里云滑块验证码服务介绍
  2. SpringBoot集成阿里云滑块验证码服务
  3. Spring Security框架集成阿里云滑块验证码服务

2. 阿里云滑块验证码服务介绍

阿里云提供了一种非常优秀的滑块验证码服务。该服务主要用于防止机器人恶意攻击。当用户登录时,需要完成滑块验证码的验证,即滑动图块来让系统验证用户的真实性。如果验证通过,就可以正常登录系统。

阿里云的滑块验证码服务可以通过以下方式接入:

  1. 通过HTTP方式调用接口
  2. 在前端页面引入JavaScript SDK

在本文中,我们将使用第一种方式来接入阿里云的滑块验证码服务。

3. SpringBoot集成阿里云滑块验证码服务

接下来,我们将介绍在SpringBoot中集成阿里云滑块验证码服务的步骤:

3.1 引入依赖

首先,在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.0.3</version>
</dependency>

3.2 配置AK和SK

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

# 阿里云AccessKey ID
spring.cloud.alicloud.access-key=your_access_key
# 阿里云Access Key Secret
spring.cloud.alicloud.secret-key=your_secret_key

3.3 调用接口完成滑块验证码服务

通过调用阿里云的滑块验证码服务接口,我们可以获取到滑块验证码的验证结果。具体步骤如下:

  1. 调用阿里云滑块验证码服务的init接口,获取滑块验证码的Ticket和Sig(签名)。
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "your_access_key", "your_secret_key");
IAcsClient client = new DefaultAcsClient(profile);
try {
     InitNvcRequest request = new InitNvcRequest();
     request.setTicket("");
     request.setHeight(320L);
     request.setScreenWidth(300L);
     request.setSig("");
     request.setScene("nc_login");
     request.setNet("ow");
     request.setSessionId(UUID.randomUUID().toString());
     request.setIp("127.0.0.1");
     InitNvcResponse response = client.getAcsResponse(request);
     String challenge = response.getData().getNvcCode();//获取验证码的challenge
     String nvcSessionId = response.getData().getNvcSessionId();//获取该验证码唯一标志
} catch (ClientException e) {
     throw new RuntimeException("generate nvc security error", e);
}
  1. 将Ticket和Sig(签名)返回给前端页面。
{
    "ticket": "LTafPqzghqo...",
    "sig": "ebZkb9i1e0pvFIBYT..."
}
  1. 在前端页面上展示滑块验证码,让用户滑动图块验证身份。

  2. 前端页面将滑块验证码验证的结果返回给SpringBoot后台,SpringBoot后台将调用阿里云的滑块验证码服务的verify接口来对用户进行验证。

DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "your_access_key", "your_secret_key");
IAcsClient client = new DefaultAcsClient(profile);
try {
     VerifyNvcRequest request = new VerifyNvcRequest();
     request.setTicket(ticket);//前端传的ticket
     request.setSig(sig); //前端传的sig
     request.setSessionId(nvcSessionId);//前端传的challenge
     request.setIp(request.getRemoteIp());
     request.setScene("nc_login");
     VerifyNvcResponse response = client.getAcsResponse(request);
     if("PASS".equalsIgnoreCase(response.getCode())){
          return true;
     }else{
          return false;
     }
} catch (ClientException e) {
     throw new RuntimeException("verify nvc security error", e);
}

以上就是SpringBoot集成阿里云滑块验证码服务的全部步骤。

4. Spring Security框架集成阿里云滑块验证码服务

接下来,我们将介绍如何在Spring Security框架中集成阿里云滑块验证码服务。

4.1 配置登录页面

首先,我们需要在Spring Security的配置文件中配置登录页面。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/login**").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .loginProcessingUrl("/login")
            .defaultSuccessUrl("/")
            .failureUrl("/login?error")
            .and()
        .csrf().disable();
}

登录页面的HTML文件如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Page</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="">
    <meta name="author" content="">
    <meta name="csrf-token" content="{{ csrf_token }}">
    <!-- Bootstrap core CSS -->
    <link href="/static/css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom styles for this template -->
    <link href="/static/css/signin.css" rel="stylesheet">
    <script src="https://g.alicdn.com/sd/nch5/index.js?t=202007302102030000/version/nvc.9.6.11.js"></script>
</head>
<body>
<div class="container">

    <form class="form-signin" action="/login" method="POST" id="login-form">
        <h2 class="form-signin-heading">Please sign in</h2>
        <input type="text" class="form-control" placeholder="Email address" name="email" required autofocus>
        <input type="password" class="form-control" placeholder="Password" name="password" required>
        <div id="nc-box-div"></div>
        <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
    </form>

</div> <!-- /container -->
<script type="text/javascript">
    NVC_Opt = {
        w:300,  // 控件宽度
        h:40, // 控件高度
        appkey:'FFFF00000000017A9545', // 应用程序标识
        scene:'register',  // 场景标识
        // 点击验证码的回调函数
        callback:function(data){
            if (data.csessionid) {
                document.getElementsByName("csessionid")[0].value = data.csessionid;
                document.getElementsByName("sig")[0].value = data.sig;
                document.getElementsByName("token")[0].value = data.token;
            }
        }
    };
    //载入验证码组件
    NVC_Client.init(document.getElementById("nc-box-div"),NVC_Opt);
</script>
</body>
</html>

4.2 配置AuthenticationProvider

接下来,我们需要在Spring Security的配置文件中配置AuthenticationProvider,以便对用户进行认证。

@Service
public class CustomAuthenticationProvider implements AuthenticationProvider {

    @Autowired
    private UserRepository userRepository;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String email = authentication.getName();
        String password = authentication.getCredentials().toString();
        User user = userRepository.findByEmail(email);
        if (user != null && user.getPassword().equals(password)) {
            return new UsernamePasswordAuthenticationToken(user, password, null);
        } else {
            throw new BadCredentialsException("Invalid email or password");
        }
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }

}

4.3 配置WebSecurityConfigurerAdapter

最后,我们需要在Spring Security的配置文件中配置WebSecurityConfigurerAdapter,把我们的AuthenticationProvider加入进来。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomAuthenticationProvider authenticationProvider;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authenticationProvider);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/login**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .loginProcessingUrl("/login")
                .defaultSuccessUrl("/")
                .failureUrl("/login?error")
                .and()
            .csrf().disable();
    }

}

以上就是Spring Security框架集成阿里云滑块验证码服务的全部步骤。

总结:

本文介绍了使用SpringBoot和Spring Security框架来实现滑块验证码验证登陆校验功能。其中,阿里云的滑块验证码服务为我们提供了非常好的支持,为我们的工作带来了很大的便利。我们可以通过以上详细的步骤来实现滑块验证码验证登陆校验功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot实现滑块验证码验证登陆校验功能详解 - Python技术站

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

相关文章

  • Vue filter 过滤当前时间 实现实时更新效果

    Vue中可以通过过滤器(Filter)来对模板中的数据进行格式化处理。本文将介绍如何使用Vue filter来过滤当前时间,并实现实时更新效果的方法。 添加全局过滤器 首先我们需要在Vue实例中添加全局过滤器。在Vue中,可以通过 Vue.filter() 方法来添加全局过滤器。下面是一个简单的例子,这个过滤器会将传入的字符串全部转换为大写: Vue.fil…

    Vue 2023年5月29日
    00
  • Vue-router的使用和出现空白页,路由对象属性详解

    Vue-router是Vue.js官方的路由管理器,可以快速地搭建单页面应用程序(SPA),并提供了丰富的导航解决方案。 Vue-router的使用 1. 安装和引入 安装Vue-router可以使用npm或yarn,在项目目录下运行以下命令: npm install vue-router 安装完成后,在项目中引入Vue-router: import Vue…

    Vue 2023年5月28日
    00
  • Vue中computed、methods与watch的区别总结

    Vue中computed、methods与watch的区别总结 在Vue中,computed、methods和watch是开发过程中常用的三个属性之一。它们都是Vue实例可以拥有的属性,但是它们的使用方式和作用有所不同。 Computed computed属性是一个函数,用于计算Vue实例中的一个值,这个值可以根据依赖于其他数据计算出来。computed属性…

    Vue 2023年5月27日
    00
  • 详解Vue的键盘事件

    详解Vue的键盘事件 Vue.js是一个流行的JavaScript框架,它减轻了开发者在构建大型Web应用程序方面的工作负担,并将应用程序的数据和界面分离。Vue.js还提供了一些内置的事件绑定选项,其中包括与键盘事件相关的选项。 键盘事件介绍 键盘事件是用户通过打字机输入字符的过程中触发的事件。Vue.js提供了四种键盘事件: @keydown: even…

    Vue 2023年5月28日
    00
  • 基于vue–key值的特殊用处详解

    基于vue–key值的特殊用处详解 什么是key值? 在Vue.js中,当使用v-for循环一个列表时,每个被循环的DOM元素都需要一个唯一标识,用于Vue的虚拟DOM算法中进行节点的识别和优化。这个唯一标识就是key值。 key值的作用 1. 提高渲染效率 通过key值,Vue可以追踪所有列表中对象的身份,在新旧节点对比时可以精确判断每个节点对应的对象是…

    Vue 2023年5月29日
    00
  • 详解vue静态资源打包中的坑与解决方案

    接下来我将详细讲解“详解vue静态资源打包中的坑与解决方案”的完整攻略。 一、问题描述 在Vue开发中,经常需要使用一些静态资源,如图片、字体等。但是,当我们将Vue项目打包后,这些静态资源文件在文件系统中的路径就会变化,这就会导致引用不到这些资源从而导致网页无法正确显示。 二、原因分析 静态资源路径问题通常由Webpack打包机制引起的。Webpack 在…

    Vue 2023年5月28日
    00
  • 浅谈vue使用axios的回调函数中this不指向vue实例,为undefined

    在Vue项目中,我们通常使用 axios 来进行 HTTP 请求。但是,在 axios 的回调函数中, this 的指向经常会出现问题,指向的不是 Vue 实例,而是 undefined。这种情况通常发生在箭头函数、回调函数嵌套等场景中。 为了解决这个问题,我们可以采取以下两种方法: 方法一:使用箭头函数 ES6 的箭头函数可以继承上下文中的 this,因此…

    Vue 2023年5月28日
    00
  • vue 组件使用中的一些细节点

    下面我来详细讲解一下vue组件使用中的一些细节点。 组件标签名的命名 在Vue中使用组件需要先在Vue实例中注册该组件,命名时需要注意以下几点: 组件标签名建议使用连字符形式如 <my-component></my-component>,而不是驼峰式形式如 <MyComponent></MyComponent>…

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