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-Auth
。timeout
是指定 Token 过期时间,单位是秒,默认为 30 分钟。cache-type
是指定 Token 的缓存方式,默认为 Memory 缓存。redis.host
、redis.port
和 redis.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,将其应用到我们的项目中,以更好地保障系统的安全和稳定运行。