SpringBoot使用token简单鉴权的具体实现方法

一、Token简单鉴权的原理

Token鉴权是一种前后端分离的权限验证方式,具体的原理如下:

  1. 用户登录时请求后端API,后端验证用户名和密码是否正确,如果正确,将返回一个Token给前端。

  2. 前端将Token保存在本地(通常是localStorage或sessionStorage),后续请求时需要将Token附带在请求头中发送给后端。

  3. 后端验证请求头中的Token是否存在、是否正确以及是否过期,如果鉴权通过,将返回请求所需的数据,否则返回401未授权状态码。

二、实现步骤

  1. 引入依赖
    在pom.xml文件中引入以下依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

其中,spring-boot-starter-security是用于Spring Security的基本配置,jjwt是用于生成和验证Token的库。

  1. 配置Spring Security
    在Spring Boot的配置文件application.yml中添加以下配置:
spring:
  security:
    user:
      name: admin
      password: admin
    jwt:
      secret: 123456

其中,security.user.name和security.user.password分别为Spring Security的默认用户名和密码,jwt.secret为Token的签名密钥。

然后在Spring Boot的启动类上添加@EnableWebSecurity注解,并继承WebSecurityConfigurerAdapter类,并重写configure(HttpSecurity http)方法:

@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    private static final String[] AUTH_WHITELIST = {
        // -- swagger ui
        "/v2/api-docs",
        "/swagger-resources",
        "/swagger-resources/**",
        "/configuration/ui",
        "/configuration/security",
        "/swagger-ui.html",
        "/webjars/**"
    };

    @Autowired
    private TokenFilter tokenFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers(AUTH_WHITELIST).permitAll()
            .anyRequest().authenticated()
            .and()
            .addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class)
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }
}

该配置将所有请求都要求必须要通过认证后才能访问,同时配置了一个TokenFilter,用于鉴别请求头中的Token的有效性。

  1. 实现Token的生成和验证
    首先在TokenUtils类中实现Token的生成和验证方法:
@Service
public class TokenUtils {

    @Value("${spring.security.jwt.secret}")
    private String secret;

    public String generateToken(String username) {
        Date now = new Date();
        Date expirationDate = new Date(now.getTime() + 1440 * 60 * 1000);

        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(now)
                .setExpiration(expirationDate)
                .signWith(SignatureAlgorithm.HS512, secret)
                .compact();
    }

    public String getUsernameFromToken(String token) {
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody().getSubject();
    }

    public boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(secret).parse(token);
            return true;
        } catch (JwtException e) {
            return false;
        }
    }
}

其中,generateToken方法用于生成Token,getUsernameFromToken方法用于获取Token中的用户名,validateToken方法用于验证Token是否有效。

然后在TokenFilter类中实现Token的验证逻辑:

public class TokenFilter extends OncePerRequestFilter {

    @Autowired
    private TokenUtils tokenUtils;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        final String headerToken = request.getHeader("Authorization");
        String token = null;
        String username = null;

        if (headerToken != null && headerToken.startsWith("Bearer ")) {
            // 解析token
            token = headerToken.substring(7);
            username = tokenUtils.getUsernameFromToken(token);

            // 验证token
            if (username != null && SecurityContextHolder.getContext().getAuthentication() == null && tokenUtils.validateToken(token)) {
                UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, null);
                authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        }

        filterChain.doFilter(request, response);
    }
}

该Filter会在所有请求到达后先从请求头中获取Token,然后经过验证后继续请求。Token的验证通过UsernamePasswordAuthenticationToken进行。将其存储到安全上下文中,保证后续的方法在需要用户信息时可以获取并调用。

三、示例

下面通过两个示例来演示如何使用Token简单鉴权:

  1. 登录接口示例
    添加一个登录接口,用于用户登录时获取Token:
@RestController
@RequestMapping("/api")
public class LoginController {

    @Autowired
    private TokenUtils tokenUtils;

    @PostMapping("/login")
    public ResponseEntity<String> login(@RequestBody Map<String, String> loginData) {
        String username = loginData.get("username");
        String password = loginData.get("password");
        if (username.equals("admin") && password.equals("admin")) {
            String token = tokenUtils.generateToken(username);
            return ResponseEntity.ok(token);
        } else {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
        }
    }
}

该接口会根据传入的用户名和密码来判断是否登录成功,如果成功,则通过TokenUtils生成一个Token并返回。否则返回401未授权状态码。

  1. 示例接口
    在Spring Boot的Controller类中添加示例接口,用于测试Token的验证:
@RestController
@RequestMapping("/api")
public class TestController {

    @GetMapping("/test")
    public ResponseEntity<String> test() {
        return ResponseEntity.ok("Hello World!");
    }
}

该接口需要Token鉴权,如果请求头中不存在或无效的Token,将返回401未授权状态码。

那么当用户请求/api/test接口时,其请求头中应该包含有效的Token信息,否则无法通过鉴权,获取数据,该接口配置如下:

@RestController
@RequestMapping("/api")
public class TestController {

    @GetMapping("/test")
    public ResponseEntity<String> test() {
        return ResponseEntity.ok("Hello World!");
    }
}

这两个示例即可完整演示使用Token简单鉴权的实现方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot使用token简单鉴权的具体实现方法 - Python技术站

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

相关文章

  • java list用法示例详解

    Java List用法示例详解 概述 Java中List是一个用于存储一组有序元素的接口,它是java.util包中的一个接口。List接口的实现类有ArrayList、LinkedList等,它们都是用于存储为一组有序元素的集合。本文将对Java中List的用法进行详细的介绍。 创建List 创建List的方法如下,其中“E”代表元素的类型。 List&l…

    Java 2023年5月26日
    00
  • HBuilderX配置tomcat外部服务器查看编辑jsp界面的方法详解

    以下是关于“HBuilderX配置Tomcat外部服务器查看编辑JSP界面的方法详解”的具体攻略。 步骤一:安装Tomcat服务器 首先需要在电脑上安装好Tomcat服务器。如果已经安装过Tomcat服务器,则可以跳过此步骤。 步骤二:配置Tomcat的conf文件 在Tomcat服务器的安装目录下,找到conf文件夹,在该文件夹下找到文件server.xm…

    Java 2023年6月15日
    00
  • JavaScript面向对象三个基本特征实例详解【封装、继承与多态】

    JavaScript面向对象三个基本特征实例详解 在JavaScript中,面向对象编程是一种常用的编程方式,它主要依靠三个基本特征:封装、继承和多态。下面将分别对它们进行详细的说明。 封装 封装是指将数据和行为封装在一个对象中,并对外部提供公共方法进行访问。 下面是一个使用封装的示例: class Person { constructor(name, ag…

    Java 2023年5月23日
    00
  • Java基础之简单介绍一下Maven

    Java基础之简单介绍一下Maven 概述 Maven是Apache基金会的一个开源项目管理和构建工具。它可以自动化地构建、测试和部署Java项目,并且可以自动下载依赖的库。 安装Maven Maven可以在官方下载页面https://maven.apache.org/download.cgi 上下载,选择适合自己操作系统的Maven版本下载,然后解压。 在…

    Java 2023年5月19日
    00
  • Java程序去调用并执行shell脚本及问题总结(推荐)

    Java程序调用执行shell脚本完整攻略 本文将详细介绍Java程序如何调用并执行shell脚本以及相关问题和解决方案。在开始之前,首先要了解一下什么是shell脚本。 shell脚本简介 shell脚本是一种基于文本的脚本语言,旨在为Unix/Linux等操作系统提供一种便捷的命令行编程方式。shell脚本可以自动执行一系列操作,例如复制、移动和删除文件…

    Java 2023年5月23日
    00
  • Java中instanceOf关键字的用法及特性详解

    Java中instanceof关键字的用法及特性详解 什么是instanceof关键字? instanceof是Java中一个二元运算符,用于判断一个对象是否是某个类或其子类的实例。instanceof的语法格式如下: 对象 instanceof 类 其中,对象可以是任何类型的对象,包括基本数据类型,而类则必须是引用类型。如果对象是类或其子类的实例,则返回t…

    Java 2023年5月26日
    00
  • C#生成word记录实例解析

    C#生成Word记录是一个常见的需求,可以使用各种库和工具来完成这个任务。本攻略将向您展示生成Word记录的完整过程。 步骤一:安装DocX库 为了生成Word记录,我们需要使用DocX库。它是一个非常流行的开源C#库,可以轻松创建和编辑Word文档。 要安装DocX库,请在Visual Studio中打开NuGet包管理器,然后搜索并安装DocX库。 步骤…

    Java 2023年6月15日
    00
  • Java如何实现http接口参数和返回值加密

    要实现HTTP接口参数和返回值加密,可以采用对称加密和非对称加密的方式。 对称加密 对称加密算法是加密和解密密钥相同的加密算法,常见的有DES、3DES、AES等。对称加密的加解密速度快,但密钥传输、保密性等存在问题。 在Java中使用AES对称加密方式来对参数和返回值进行加密。使用如下代码: import javax.crypto.Cipher; impo…

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