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

2023-06-01 21:57:13 浏览数 (1)

1. 什么是 Sa-Token

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

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

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

2. SpringBoot 如何使用 Sa-Token

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

2.1. 添加依赖

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

代码语言:html复制
<dependency>
    <groupId>cn.dev33.satoken</groupId>
    <artifactId>sa-token-starter-springboot</artifactId>
    <version>1.16.1-RELEASE</version>
</dependency>

2.2. 配置文件

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

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

代码语言:text复制
# 数据库连接信息
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 的相关配置,具体代码如下:

代码语言:text复制
# 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 拦截并进行身份认证和权限控制。

代码语言:java复制
@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 等操作。

代码语言:java复制
@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 值保存下来,方便后续测试接口时使用。

代码语言:text复制
POST http://localhost:8080/login HTTP/1.1
Content-Type: application/json;charset=UTF-8

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

返回结果如下:

代码语言:json复制
HTTP/1.1 200
Authorization: e849c5fe820a2a2b2519c4b8cc6b3134
Content-Type: text/plain;charset=UTF-8

e849c5fe820a2a2b2519c4b8cc6b3134

3.2. 访问受保护的资源

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

代码语言:text复制
GET http://localhost:8080/protected HTTP/1.1
Authorization: e849c5fe820a2a2b2519c4b8cc6b3134

返回结果如下:

代码语言:json复制
HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8

Hello, protected resource!

3.3. 访问注销接口

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

代码语言:text复制
GET http://localhost:8080/logout HTTP/1.1
Authorization: e849c5fe820a2a2b2519c4b8cc6b3134

返回结果如下:

代码语言:json复制
HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8

退出成功
代码语言:text复制
GET http://localhost:8080/protected HTTP/1.1
Authorization: e849c5fe820a2a2b2519c4b8cc6b3134

返回结果如下:

代码语言:json复制
HTTP/1.1 401
Content-Type: text/plain;charset=UTF-8

Unauthorized

4. 总结

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

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

0 人点赞