SpringBoot框架集成token实现登录校验功能

yizhihongxing

下面是详细讲解SpringBoot框架集成token实现登录校验功能的完整攻略。

一、什么是Token

在Web开发中,服务端不能直接拿到客户端的登录状态,而客户端又需要传递一些数据,这时就需要一种机制来帮助服务端识别客户端的身份,这种机制就是Token。

Token是一种令牌,本质上就是一个字符串,客户端在登录时通过身份验证后,服务端会返回给客户端一个Token,每次客户端请求时都会携带这个Token,服务端通过验证Token来确定客户端的身份。

二、实现步骤

1. 引入依赖

在pom.xml中引入SpringBoot的web和security依赖,以及生成Token所必须的JWT依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Spring Security -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<!-- JWT -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.2</version>
</dependency>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>

2. 配置拦截器

通过实现HandlerInterceptor接口,实现Token校验的拦截器。

@Component
public class AuthenticationInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取请求头中的Token
        String token = request.getHeader("Authorization");
        if (StringUtils.isNotBlank(token)) {
            try {
                // 验证Token是否正确
                Jwts.parser().setSigningKey("MyJwtSecret").parseClaimsJws(token.replace("Bearer ", ""));
                return true;
            } catch (Exception e) {
                throw new BusinessException("无效的Token");
            }
        } else {
            throw new BusinessException("缺少Token");
        }
    }
}

3. 配置安全认证

WebSecurityConfigurerAdapter中配置UserDetailsServicePasswordEncoder,实现安全认证。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsServiceImpl userDetailsService;

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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/login").permitAll()
                .antMatchers(HttpMethod.POST, "/user").hasRole("ADMIN")
                .anyRequest().authenticated()
                .and()
                .csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .addFilterBefore(tokenAuthenticationFilter(), BasicAuthenticationFilter.class);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public TokenAuthenticationFilter tokenAuthenticationFilter() {
        return new TokenAuthenticationFilter();
    }

    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

4. 配置Token生成

在登录成功后,通过JWT生成Token,并返回给前端。

@Service
public class AuthServiceImpl implements AuthService {
    @Override
    public String login(UserDto userDto) {
        UserDetails userDetails = userDetailsService.loadUserByUsername(userDto.getUsername());
        if (userDetails == null || !passwordEncoder.matches(userDto.getPassword(), userDetails.getPassword())) {
            throw new BusinessException("用户名或密码不正确");
        }
        String token = Jwts.builder()
                .setSubject(userDetails.getUsername())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 60 * 60 * 24 * 1000))
                .signWith(SignatureAlgorithm.HS512, "MyJwtSecret")
                .compact();
        return "Bearer " + token;
    }
}

5. 测试接口

编写测试接口,通过Token校验保护接口的安全。

@RestController
public class TestController {
    @GetMapping("/test")
    public String test() {
        return "Hello, World!";
    }

    @PostMapping("/user")
    public String saveUser() {
        return "Save user";
    }
}

三、示例应用

下面是两个简单的示例应用:

示例1:登录成功生成Token

POST /login HTTP/1.1
Host: localhost:8080
Content-Type: application/json

{"username": "admin", "password": "admin"}
HTTP/1.1 200 OK
Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTYyNDUyMzk5MCwiZXhwIjoxNjI0NTMwNjAwfQ.VR1HBXrzr6AAUSI3vAhN8v8RNSj3r4GgUCYDoA9BPrLOTOl8BU-L8ap6lhDcE3YlXxDlOqPSuPTv6NQGCWBIhA

示例2:未传递Token校验失败

GET /test HTTP/1.1
Host: localhost:8080
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8

{"code":400,"message":"缺少Token"}

示例3:传递无效Token校验失败

GET /test HTTP/1.1
Host: localhost:8080
Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTYyNDUyMzU1NCwiZXhwIjoxNjI0NTMwMzU0fQ.sVb6XEBVfSzDpvZirq_JYFmm1MXJhcbtzrlLmdeLZ1x-KCcoy8jPKpXGnwCgdzF3n_h_J-bQrIFV7E9cv0yXzw

HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8

{"code":400,"message":"无效的Token"}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot框架集成token实现登录校验功能 - Python技术站

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

相关文章

  • Java Array.sort()源码分析讲解

    Java Array.sort()源码分析讲解 概述 Java的Array类中提供了一个sort()方法,用于对数组进行排序。sort()方法是一个static的方法,因此可以直接通过类名调用。 Arrays.sort(array); sort()方法有两个重载版本: public static void sort(byte[] a) public stat…

    Java 2023年5月19日
    00
  • 详解Spring Boot 属性配置和使用

    下面给你详细讲解“详解SpringBoot属性配置和使用”的完整攻略。 一、引言 Spring Boot 是一个高效、快速的开发框架,它提供了很多功能,其中之一就是属性配置——即让你的项目可以从外部读取配置信息。通过这样的方式很方便的管理数据库连接、端口号、应用名称等常规信息。 二、属性文件的配置 Spring Boot 项目使用 application.p…

    Java 2023年5月15日
    00
  • SSH框架网上商城项目第24战之Struts2中处理多个Model请求的方法

    下面将详细讲解“SSH框架网上商城项目第24战之Struts2中处理多个Model请求的方法”的完整攻略。 前言 在网上商城项目开发过程中,处理多个 Model 的请求是一个比较常见的需求。本文将详细说明在 Struts2 中如何处理多个 Model 的请求,并提供两个示例说明。 具体步骤 步骤一:定义 Action 类 在 Struts2 中,我们可以通过…

    Java 2023年5月26日
    00
  • 详解如何在Spring Boot启动后执行指定代码

    在Spring Boot启动后执行指定代码可以使用Spring Boot提供的ApplicationRunner和CommandLineRunner接口。这两个接口都是在Spring Boot应用程序启动完成后运行的回调,并且被称为Spring Boot应用程序的启动回调。 ApplicationRunner接口 ApplicationRunner接口中包含…

    Java 2023年5月20日
    00
  • 浅谈java面向对象的数组化信息处理

    浅谈Java面向对象的数组化信息处理 什么是数组化信息处理 数组化信息处理是指将一系列相同类型的数据存储在一个数组中,然后进行集中处理的过程。在Java中,数组是一种非常实用的数据结构,可以方便地将一组相同类型的数据进行集中管理和操作。 面向对象的数组化信息处理 在Java中,面向对象编程是一种重要的编程思想。面向对象的数组化信息处理就是将面向对象和数组化信…

    Java 2023年5月26日
    00
  • java实现仿射密码加密解密

    Java实现仿射密码加密解密攻略 简介 仿射密码是一种古典密码,具有加解密速度快,但安全性相对较低的特点。仿射密码基于字母的置换进行加密、解密,通过线性变换实现。 在该教程中,我们将使用Java来实现仿射密码的加密与解密。下面将会详细地介绍实现过程。 实现过程 设计思路 仿射密码需要进行加密、解密的文本内容,所以我们需要设计一个界面来获取用户输入的明文或密文…

    Java 2023年5月19日
    00
  • 详解spring Boot 集成 Thymeleaf模板引擎实例

    我来为你详细讲解“详解SpringBoot集成Thymeleaf模板引擎实例”的攻略。 概述 在SpringBoot应用中,Thymeleaf是一种流行的模板引擎,具有出色的可维护性和可扩展性。本文将详细介绍如何使用SpringBoot集成Thymeleaf模板引擎,帮助开发者快速地搭建Web应用,并在其中使用Thymeleaf实现模板渲染。 集成Thyme…

    Java 2023年5月15日
    00
  • java 实现通过 post 方式提交json参数操作

    下面是完整攻略: 1. 概述 Java通过post方式提交Json参数操作的流程与普通的表单提交操作类似,只不过需要注意Json参数的构造和提交格式,主要分以下步骤:1. 组织Json参数2. 将Json参数转换为字符串3. 构造Http请求4. 设置Http请求头信息5. 发送Http请求6. 处理返回结果 2. 组织Json参数 首先需要明确Json参数…

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