本文将详细介绍如何使用Sa-Token进行用户认证、权限管理、实时会话以及Token生成与管理,帮助读者快速掌握Sa-Token实战技巧。Sa-Token是一款轻量级的Java权限认证工具包,适用于各种应用场景。我们将通过示例代码展示如何安装和使用Sa-Token,解决常见的权限认证问题。
Sa-Token简介与安装Sa-Token的基本概念
Sa-Token 是一款用于权限认证的 Java 工具包,主要用于解决权限认证、会话管理等问题。它具有简单易用、轻量级、高性能等特点,适用于各种 Java 应用场景。
Sa-Token 的主要功能包括但不限于:
- 用户认证与登录
- 权限管理与角色分配
- 实时会话与在线状态管理
- Token 生成与管理
Sa-Token的安装方法
安装 Sa-Token 可以通过 Maven 或 Gradle 方式进行。以下是通过 Maven 进行安装的步骤:
-
在项目的
pom.xml
文件中添加 Sa-Token 的依赖:<dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token</artifactId> <version>1.29.0</version> </dependency>
- 下载并引入 Sa-Token 的 jar 包:
- 从官方仓库下载 Sa-Token 的 jar 包。
- 将下载的 jar 包放入项目的
lib
目录中。 - 在项目的
pom.xml
中配置相应的依赖,例如:<dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token</artifactId> <version>1.29.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/sa-token-1.29.0.jar</systemPath> </dependency>
创建用户认证接口
为了实现用户认证,首先需要创建一个用户认证接口。该接口负责接收用户的登录请求,并验证用户的身份信息。
示例代码如下:
import cn.dev33.sa.BaseSaTokenController;
import cn.dev33.sa.annotation.SaCheckPermission;
import cn.dev33.sa.annotation.SaCheckRole;
import cn.dev33.sa.annotation.SaLoginUser;
import cn.dev33.sa.core.SaResult;
import cn.dev33.sa.model.SaUser;
import cn.dev33.sa.service.SaTokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AuthController extends BaseSaTokenController {
@Autowired
private SaTokenService saTokenService;
@PostMapping("/login")
public SaResult login(@RequestBody String data) {
// 从请求中获取用户信息
String username = getJson().getStr("username");
String password = getJson().getStr("password");
// 验证用户名和密码
boolean result = validateUser(username, password);
if (!result) {
return SaResult.notPass("用户名或密码错误");
}
// 登录成功后生成 token
String token = saTokenService.login(username, password);
return SaResult.ok().put("token", token);
}
private boolean validateUser(String username, String password) {
// 这里可以调用数据库或其他认证服务验证用户名和密码
// 例如:
// boolean isValid = userService.validateUser(username, password);
boolean isValid = true; // 假设这里验证结果总是正确的
return isValid;
}
}
权限管理与角色分配
权限与角色的概念
权限管理是 Sa-Token 的核心功能之一。权限管理分为两种主要类型:
- 权限点:代表具体的权限,例如
create-post
、edit-post
。 - 角色:代表一组权限的集合,例如
admin
角色拥有create-post
和edit-post
两个权限点。
实现权限管理与角色分配
要实现权限管理与角色分配,需要在用户登录后为其分配角色,并检查其是否具有特定权限。
示例代码如下:
import cn.dev33.sa.BaseSaTokenController;
import cn.dev33.sa.annotation.SaCheckPermission;
import cn.dev33.sa.annotation.SaCheckRole;
import cn.dev33.sa.annotation.SaLoginUser;
import cn.dev33.sa.core.SaResult;
import cn.dev33.sa.model.SaUser;
import cn.dev33.sa.service.SaTokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AuthController extends BaseSaTokenController {
@Autowired
private SaTokenService saTokenService;
@PostMapping("/login")
public SaResult login(@RequestBody String data) {
// 从请求中获取用户信息
String username = getJson().getStr("username");
String password = getJson().getStr("password");
// 验证用户名和密码
boolean result = validateUser(username, password);
if (!result) {
return SaResult.notPass("用户名或密码错误");
}
// 登录成功后生成 token
String token = saTokenService.login(username, password);
return SaResult.ok().put("token", token);
}
@PostMapping("/grant-role")
@SaLoginUser
public SaResult grantRole(@SaLoginUser SaUser user, @RequestBody String data) {
String role = getJson().getStr("role");
if (saTokenService.grantRole(user.getId(), role)) {
return SaResult.ok();
}
return SaResult.notPass();
}
@PostMapping("/check-permission")
@SaLoginUser
@SaCheckPermission("edit-post")
public SaResult checkPermission() {
return SaResult.ok();
}
private boolean validateUser(String username, String password) {
// 验证用户名和密码
boolean isValid = true; // 假设这里验证结果总是正确的
return isValid;
}
}
实时会话与在线状态管理
实时会话管理
Sa-Token 提供了实时会话管理功能,可以监控用户的登录状态。为了实现实时会话管理,可以使用 SaTokenService
中的 kickoutByUserName
和 kickoutBySessionId
方法。
示例代码如下:
import cn.dev33.sa.BaseSaTokenController;
import cn.dev33.sa.annotation.SaLoginUser;
import cn.dev33.sa.core.SaResult;
import cn.dev33.sa.model.SaUser;
import cn.dev33.sa.service.SaTokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SessionController extends BaseSaTokenController {
@Autowired
private SaTokenService saTokenService;
@PostMapping("/kickout-user")
public SaResult kickoutUser(@RequestBody String data) {
String username = getJson().getStr("username");
boolean result = saTokenService.kickoutByUserName(username);
return SaResult.ok().put("result", result);
}
@PostMapping("/kickout-session")
public SaResult kickoutSession(@RequestBody String data) {
String sessionId = getJson().getStr("sessionId");
boolean result = saTokenService.kickoutBySessionId(sessionId);
return SaResult.ok().put("result", result);
}
}
在线状态管理
Sa-Token 还提供了在线状态管理功能,可以帮助你管理用户的在线状态。为了实现在线状态管理,可以使用 SaTokenService
中的 setOnline
方法。
示例代码如下:
import cn.dev33.sa.BaseSaTokenController;
import cn.dev33.sa.annotation.SaLoginUser;
import cn.dev33.sa.core.SaResult;
import cn.dev33.sa.model.SaUser;
import cn.dev33.sa.service.SaTokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OnlineController extends BaseSaTokenController {
@Autowired
private SaTokenService saTokenService;
@PostMapping("/set-online")
@SaLoginUser
public SaResult setOnline(@SaLoginUser SaUser user) {
boolean result = saTokenService.setOnline(user.getId(), true);
return SaResult.ok().put("result", result);
}
@PostMapping("/set-offline")
@SaLoginUser
public SaResult setOffline(@SaLoginUser SaUser user) {
boolean result = saTokenService.setOnline(user.getId(), false);
return SaResult.ok().put("result", result);
}
}
Token生成与管理
Token的生成
在用户登录时,Sa-Token 会为用户生成一个 Token。这个 Token 是用户身份的唯一标识符,用于后续的权限验证。
示例代码如下:
import cn.dev33.sa.BaseSaTokenController;
import cn.dev33.sa.annotation.SaLoginUser;
import cn.dev33.sa.annotation.SaLogout;
import cn.dev33.sa.core.SaResult;
import cn.dev33.sa.model.SaUser;
import cn.dev33.sa.service.SaTokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TokenController extends BaseSaTokenController {
@Autowired
private SaTokenService saTokenService;
@PostMapping("/login")
public SaResult login(@RequestBody String data) {
// 从请求中获取用户信息
String username = getJson().getStr("username");
String password = getJson().getStr("password");
// 验证用户名和密码
boolean result = validateUser(username, password);
if (!result) {
return SaResult.notPass("用户名或密码错误");
}
// 登录成功后生成 token
String token = saTokenService.login(username, password);
return SaResult.ok().put("token", token);
}
private boolean validateUser(String username, String password) {
// 验证用户名和密码
boolean isValid = true; // 假设这里验证结果总是正确的
return isValid;
}
}
Token的刷新与回收
Token 的刷新可以延长 Token 的有效期。Token 的回收可以强制用户重新登录。
示例代码如下:
import cn.dev33.sa.BaseSaTokenController;
import cn.dev33.sa.annotation.SaLoginUser;
import cn.dev33.sa.annotation.SaLogout;
import cn.dev33.sa.core.SaResult;
import cn.dev33.sa.model.SaUser;
import cn.dev33.sa.service.SaTokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TokenController extends BaseSaTokenController {
@Autowired
private SaTokenService saTokenService;
@PostMapping("/refresh-token")
@SaLoginUser
public SaResult refreshToken(@SaLoginUser SaUser user) {
String token = saTokenService.renew(user.getId());
return SaResult.ok().put("token", token);
}
@PostMapping("/logout")
@SaLogout
public SaResult logout(@SaLoginUser SaUser user) {
saTokenService.logout(user.getId());
return SaResult.ok();
}
}
常见问题与解决方案
常见错误及解决方法
-
Token 无效:
- 确认 Token 是否过期。
- 检查 Token 的生成和验证过程是否正确。
- 检查 Token 的配置是否正确。
-
权限验证失败:
- 确认用户是否具有相应的权限。
- 检查权限点配置是否正确。
- 检查角色分配是否正确。
- 用户会话问题:
- 确认会话是否已经过期。
- 检查会话管理配置是否正确。
- 检查会话相关的 API 是否正常工作。
使用Sa-Token的注意事项
-
Token 安全性:
- Token 应该通过 HTTPS 进行传输,确保数据安全。
- Token 应该妥善保存,避免泄露。
-
权限管理:
- 权限点和角色的配置应该清晰明了,便于维护和扩展。
- 权限验证逻辑应该在代码中清晰地体现出来。
- 在线状态管理:
- 实时会话管理可以提高系统的安全性,但也需要合理配置,避免频繁的会话失效。
- 在线状态管理可以提高用户体验,但需要合理配置,避免不必要的在线状态变化。
通过以上步骤,你可以快速地理解和使用 Sa-Token,构建一个安全、高效的权限认证系统。如果你在使用过程中遇到任何问题,可以参考官方文档或联系开发者获取支持。
共同学习,写下你的评论
评论加载中...
作者其他优质文章