前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot 如何使用 Sa-Token 完成权限认证?

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

原创
作者头像
网络技术联盟站
发布2023-06-01 21:57:13
9190
发布2023-06-01 21:57:13
举报

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,将其应用到我们的项目中,以更好地保障系统的安全和稳定运行。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 什么是 Sa-Token
  • 2. SpringBoot 如何使用 Sa-Token
    • 2.1. 添加依赖
      • 2.2. 配置文件
        • 2.3. 编写安全配置类
          • 2.4. 编写登录和注销接口
          • 3. 实现效果
            • 3.1. 登录
              • 3.2. 访问受保护的资源
                • 3.3. 访问注销接口
                • 4. 总结
                相关产品与服务
                云数据库 Redis
                腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档