SpringBoot 如何使用 Sa-Token 完成权限认证?

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: SpringBoot 如何使用 Sa-Token 完成权限认证?

1. 什么是 Sa-Token

Sa-Token 是一个轻量级 Java 权限认证框架,在其官网中,它的自我介绍是:

非常易用且功能强大的Java身份认证授权框架,专注于减少用户认证授权开发的工作量,让开发人员可以将精力更多的放在业务逻辑中。

它可以轻松地实现用户身份验证、权限控制、会话管理等功能。 使用 Sa-Token 可以大大简化我们的权限认证开发工作,提高开发效率,因此它受到了越来越多的 Java 开发者的喜爱。

2. SpringBoot 如何使用 Sa-Token

接下来我们将介绍如何在 SpringBoot 中使用 Sa-Token,实现权限认证功能。

2.1. 添加依赖

首先,我们需要在 pom.xml 文件中添加 Sa- Token 的依赖,具体代码如下:

<dependency>
    <groupId>cn.dev33.satoken</groupId>
    <artifactId>sa-token-starter-springboot</artifactId>
    <version>1.16.1-RELEASE</version>
</dependency>

2.2. 配置文件

在添加完依赖之后,我们需要在配置文件中进行相关的配置,主要包括数据库连接信息和 Sa-Token 的相关配置。

首先,我们需要在配置文件中添加数据库连接信息,具体代码如下:

# 数据库连接信息
spring.datasource.url = jdbc:mysql://localhost:3306/sa_token?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username = root
spring.datasource.password = root

# 配置druid监控
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*

然后,我们需要在配置文件中添加 Sa-Token 的相关配置,具体代码如下:

# Sa-Token 配置
sa-token.token-name=mytoken
sa-token.timeout=1800
sa-token.cache-type=redis
sa-token.redis.host=localhost
sa-token.redis.port=6379
sa-token.redis.password=
sa-token.redis.database=0

其中,token-name 是指定 Token 的名称,默认为Sa-Token-Authtimeout是指定 Token 过期时间,单位是秒,默认为 30 分钟。cache-type是指定 Token 的缓存方式,默认为 Memory 缓存。redis.hostredis.portredis.password 是指定 Redis 的相关信息。如果使用的是 Memory 缓存,则不需要对 Redis 相关配置进行配置。

2.3. 编写安全配置类

接下来,我们需要编写一个安全配置类,用于配置 Sa-Token 的 Servlet 拦截器和 Filter 拦截器,以保证所有的请求都会被 Sa-Token 拦截并进行身份认证和权限控制。

@Configuration
public class SaTokenConfigure {
   

    @Bean
    public SaTokenWebInterceptor getSaTokenWebInterceptor() {
   
        return new SaTokenWebInterceptor()
            .addPathPatterns("/**") // 拦截所有请求
            .excludePathPatterns("/login.html", "/login", "/logout"); // 排除登录和注销接口
    }

    @Bean
    public SaServletFilter getSaServletFilter() {
   
        return new SaServletFilter()
            .addInclude("/**"); // 拦截所有请求
    }
}

在上述代码中,我们编写了一个 SaTokenConfigure 类,并分别编写了 getSaTokenWebInterceptor()getSaServletFilter() 方法,用于配置 Sa-Token 的 Servlet 拦截器和 Filter 拦截器。其中,addPathPatterns("/**") 表示拦截所有的请求,excludePathPatterns("/login.html", "/login", "/logout") 表示排除登录和注销接口,以保证不会出现无限递归的错误。

2.4. 编写登录和注销接口

最后,我们还需要编写一个登录和注销接口,用于进行用户的登录、退出和设置 Token 等操作。

@RestController
public class LoginController {
   

    /**
     * 模拟登录接口
     */
    @PostMapping("/login")
    public String login(String username, String password, HttpServletResponse response) {
   
        // 登录验证成功后,设置token,并将token返回给前端
        String token = SaTokenManager.createToken(username);
        response.setHeader("Authorization", token);
        return token;
    }

    /**
     * 模拟登出接口
     */
    @GetMapping("/logout")
    public String logout(HttpServletRequest request) {
   
        // 登出时,删除token
        SaTokenManager.deleteTokenByLoginId(SaTokenContext.getLoginId());
        return "退出成功";
    }
}

在上述代码中,我们编写了一个 LoginController 类,并分别编写了 login()logout() 方法,用于进行用户的登录、退出和设置 Token 等操作。其中,PostMapping("/login") 表示登录接口使用 POST 请求方式,GetMapping("/logout") 表示注销接口使用 GET 请求方式。

3. 实现效果

在完成以上步骤之后,我们已经成功地将 Sa-Token 集成到了 SpringBoot 应用中,下面让我们来测试一下它的实际效果。

3.1. 登录

访问登录接口 /login,并传入用户名和密码,然后将获取到的 Token 值保存下来,方便后续测试接口时使用。

POST http://localhost:8080/login HTTP/1.1
Content-Type: application/json;charset=UTF-8

{
    "username": "admin",
    "password": "123456"
}

返回结果如下:

HTTP/1.1 200
Authorization: e849c5fe820a2a2b2519c4b8cc6b3134
Content-Type: text/plain;charset=UTF-8

e849c5fe820a2a2b2519c4b8cc6b3134

3.2. 访问受保护的资源

访问一个需要权限验证的资源,此时如果在请求头中携带正确的 Token,那么请求会被正常处理,否则会返回 401 错误码。

GET http://localhost:8080/protected HTTP/1.1
Authorization: e849c5fe820a2a2b2519c4b8cc6b3134

返回结果如下:

HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8

Hello, protected resource!

3.3. 访问注销接口

访问注销接口 /logout,传入正确的 Token,然后再访问受保护的资源 /protected,此时应该返回 401 错误码,表示未授权。

GET http://localhost:8080/logout HTTP/1.1
Authorization: e849c5fe820a2a2b2519c4b8cc6b3134

返回结果如下:

HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8

退出成功
GET http://localhost:8080/protected HTTP/1.1
Authorization: e849c5fe820a2a2b2519c4b8cc6b3134

返回结果如下:

HTTP/1.1 401
Content-Type: text/plain;charset=UTF-8

Unauthorized

4. 总结

本文详细介绍了如何在 SpringBoot 中集成 Sa-Token,用于完成身份认证和权限控制等功能。具体来说,我们通过添加依赖、配置文件、编写安全配置类和登录和注销接口等步骤,完成了 Sa-Token 的集成工作,并对其实现效果进行了测试。

总的来说,Sa-Token 是一个非常易用且功能强大的 Java 权限认证框架,可以大大提高我们的权限认证开发效率。因此,我们应该积极学习和使用 Sa-Token,将其应用到我们的项目中,以更好地保障系统的安全和稳定运行。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
安全 Java 数据库
安全无忧!在 Spring Boot 3.3 中轻松实现 TOTP 双因素认证
【10月更文挑战第8天】在现代应用程序开发中,安全性是一个不可忽视的重要环节。随着技术的发展,双因素认证(2FA)已经成为增强应用安全性的重要手段之一。本文将详细介绍如何在 Spring Boot 3.3 中实现基于时间的一次性密码(TOTP)双因素认证,让你的应用安全无忧。
105 5
|
4月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
254 0
|
2月前
|
安全 Java 关系型数据库
springboot整合springsecurity,从数据库中认证
本文介绍了如何在SpringBoot应用中整合Spring Security,并从数据库中进行用户认证的完整步骤,包括依赖配置、数据库表创建、用户实体和仓库接口、用户详情服务类、安全配置类、控制器类以及数据库初始化器的实现。
122 3
springboot整合springsecurity,从数据库中认证
|
2月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
31 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
4月前
|
消息中间件 安全 Java
Spring Boot 基于 SCRAM 认证集成 Kafka 的详解
【8月更文挑战第4天】本文详解Spring Boot结合SCRAM认证集成Kafka的过程。SCRAM为Kafka提供安全身份验证。首先确认Kafka服务已启用SCRAM,并准备认证凭据。接着,在`pom.xml`添加`spring-kafka`依赖,并在`application.properties`中配置Kafka属性,包括SASL_SSL协议与SCRAM-SHA-256机制。创建生产者与消费者类以实现消息的发送与接收功能。最后,通过实际消息传递测试集成效果与认证机制的有效性。
154 4
|
7月前
|
JavaScript Java 测试技术
基于springboot+vue.js的基于工程教育认证的计算机课程管理平台附带文章和源代码设计说明文档ppt
基于springboot+vue.js的基于工程教育认证的计算机课程管理平台附带文章和源代码设计说明文档ppt
50 6
|
6月前
|
存储 安全 Java
Spring Boot中的OAuth2认证与授权
Spring Boot中的OAuth2认证与授权
|
6月前
|
安全 Java Spring
教程:在Spring Boot应用中集成OAuth 2.0认证
教程:在Spring Boot应用中集成OAuth 2.0认证
1天搞定SpringBoot+Vue全栈开发 (9)JWT跨域认证
1天搞定SpringBoot+Vue全栈开发 (9)JWT跨域认证
|
6月前
|
NoSQL 安全 Linux
springboot+shiro+redis前后端分离实现认证(一)
springboot+shiro+redis前后端分离实现认证(一)
233 0