本文详细介绍了SaToken项目实战,涵盖从安装配置到用户认证、Token管理、权限控制、在线用户管理以及错误处理与日志记录的全过程。通过多个示例代码,帮助读者快速掌握SaToken的使用方法。SaToken项目实战不仅适用于Java等后端语言,还能帮助企业快速搭建安全的权限控制系统。
SaToken项目实战:从入门到上手教程 SaToken简介与安装什么是SaToken
SaToken是一个基于JWT的Token管理框架,用于实现权限管理、登录认证、Token管理等功能。它适用于Java、.NET、PHP等后端语言,能够帮助企业快速搭建安全的权限控制系统。SaToken的核心在于Token的生成、存储、验证和过期处理,通过这些特性,可以实现登录认证、权限控制等功能。
SaToken主要功能介绍
SaToken主要功能包括:
- Token生成与验证:用户登录时生成Token,每次请求时进行Token验证,确保请求来自合法的用户。
- 权限控制:基于Token的权限控制,支持细粒度权限管理。
- 在线用户管理:实时管理在线用户,提供在线状态更新、在线用户统计等功能。
- 错误处理与日志记录:提供统一的错误处理机制和日志记录功能。
SaToken的安装与环境配置
安装SaToken非常简单,可以通过Maven或Gradle引入SaToken依赖。
Maven
在pom.xml
文件中添加以下依赖:
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sata-token</artifactId>
<version>2.4.7</version>
</dependency>
Gradle
在build.gradle
文件中添加以下依赖:
implementation 'cn.dev33:sata-token:2.4.7'
安装完成后,需要进行环境配置。首先,创建一个配置类,用于设置SaToken的配置信息。例如:
import cn.dev33.sa.SaTokenManager;
import cn.dev33.sa.strategy.SaStrategyJwt;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SaTokenConfig {
@Bean
public SaTokenManager saTokenManager() {
SaTokenManager manager = new SaTokenManager();
manager.setStrategy(new SaStrategyJwt());
return manager;
}
}
用户认证与登录实现
创建用户认证接口
在项目中,你需要创建一个用户认证接口,用于处理用户登录请求。下面是一个简单的Spring Boot示例:
import cn.dev33.sa.SaTokenManager;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
private final SaTokenManager saTokenManager;
public UserController(SaTokenManager saTokenManager) {
this.saTokenManager = saTokenManager;
}
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
// 这里可以添加对用户名和密码的校验逻辑
return saTokenManager.login(username);
}
}
用户登录流程详解
用户登录流程如下:
- 用户通过前端提交用户名和密码。
- 后端接收请求并验证用户名和密码是否正确。
- 如果验证通过,生成Token并返回给前端。
- 前端保存Token,并在后续请求中携带Token。
实战示例:简易用户登录实现
为了实现一个简易的用户登录功能,我们首先需要一个简单的用户数据源,这里使用内存中的数据源来模拟用户验证:
import java.util.HashMap;
import java.util.Map;
public class SimpleUserDataSource {
private Map<String, String> users = new HashMap<>();
public SimpleUserDataSource() {
users.put("admin", "admin123");
}
public boolean checkUser(String username, String password) {
return users.containsKey(username) && users.get(username).equals(password);
}
}
修改UserController
中的逻辑,使用SimpleUserDataSource
来验证用户:
import cn.dev33.sa.SaTokenManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
private final SaTokenManager saTokenManager;
private final SimpleUserDataSource dataSource;
public UserController(SaTokenManager saTokenManager, SimpleUserDataSource dataSource) {
this.saTokenManager = saTokenManager;
this.dataSource = dataSource;
}
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
if (!dataSource.checkUser(username, password)) {
return "用户名或密码错误";
}
return saTokenManager.login(username);
}
}
这样,当用户提交正确的用户名和密码时,系统会生成一个Token并返回给用户。
Token管理与验证Token的生成与存储
Token的生成通常在用户登录时进行,使用SaTokenManager
的login
方法生成Token。Token存储在客户端,每次请求时携带Token进行验证。
import cn.dev33.sa.SaTokenManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TokenController {
private final SaTokenManager saTokenManager;
public TokenController(SaTokenManager saTokenManager) {
this.saTokenManager = saTokenManager;
}
@GetMapping("/token")
public String getToken(@RequestParam String username) {
return saTokenManager.login(username);
}
}
Token验证与过期处理
Token验证通常在每个接口调用时进行。使用SaTokenManager
的getLoginUser
方法可以验证Token是否有效。
import cn.dev33.sa.SaTokenManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TokenController {
private final SaTokenManager saTokenManager;
public TokenController(SaTokenManager saTokenManager) {
this.saTokenManager = saTokenManager;
}
@GetMapping("/secure")
public String secureEndpoint(@RequestHeader("Authorization") String token) {
if (saTokenManager.getLoginUser(token) == null) {
return "未登录";
}
return "访问成功";
}
}
Token过期处理由SaToken自动管理。过期的Token会自动失效,无法通过验证。
实战示例:Token的使用与验证
实现一个简单的Token生成和验证示例:
import cn.dev33.sa.SaTokenManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TokenController {
private final SaTokenManager saTokenManager;
public TokenController(SaTokenManager saTokenManager) {
this.saTokenManager = saTokenManager;
}
@PostMapping("/login")
public String login(@RequestParam String username) {
return saTokenManager.login(username);
}
@GetMapping("/secure")
public String secureEndpoint(@RequestParam String token) {
if (saTokenManager.getLoginUser(token) == null) {
return "未登录";
}
return "访问成功";
}
}
用户登录时会生成一个Token,然后在访问受保护资源时携带这个Token进行验证。
权限控制与鉴权身份权限的定义与管理
权限管理通常通过定义角色和权限来实现。SaToken支持细粒度的权限管理,可以定义不同的角色和权限,并在接口调用时进行权限验证。
import cn.dev33.sa.SaTokenManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PermissionController {
private final SaTokenManager saTokenManager;
public PermissionController(SaTokenManager saTokenManager) {
this.saTokenManager = saTokenManager;
}
@GetMapping("/secure")
public String secureEndpoint(@RequestHeader("Authorization") String token) {
// 检查角色
if (!saTokenManager.getRole(token).equals("admin")) {
return "无权限访问";
}
return "访问成功";
}
}
接口权限配置与控制
在接口层面,可以通过注解来配置权限。例如,使用自定义注解来限制访问权限:
import cn.dev33.sa.SaTokenManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PermissionController {
private final SaTokenManager saTokenManager;
public PermissionController(SaTokenManager saTokenManager) {
this.saTokenManager = saTokenManager;
}
@GetMapping("/secure")
public String secureEndpoint(@RequestHeader("Authorization") String token) {
// 检查权限
if (!saTokenManager.isAction(token, "read:admin")) {
return "无权限访问";
}
return "访问成功";
}
}
实战示例:基于SaToken的接口权限控制
实现一个简单的接口权限控制示例:
import cn.dev33.sa.SaTokenManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PermissionController {
private final SaTokenManager saTokenManager;
public PermissionController(SaTokenManager saTokenManager) {
this.saTokenManager = saTokenManager;
}
@PostMapping("/login")
public String login(@RequestParam String username) {
return saTokenManager.login(username);
}
@GetMapping("/secure")
public String secureEndpoint(@RequestParam String token) {
if (!saTokenManager.isAction(token, "read:admin")) {
return "无权限访问";
}
return "访问成功";
}
}
用户登录时生成一个Token,然后在访问受保护资源时携带这个Token进行验证。只有具备特定权限的用户才能访问受保护的资源。
实时在线管理实时在线用户的管理
SaToken支持实时在线用户的管理,可以实现在线用户的统计、在线状态的监听等功能。首先,需要配置在线用户管理的配置类:
import cn.dev33.sa.SaTokenManager;
import cn.dev33.sa.strategy.SaStrategyJwt;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SaTokenConfig {
@Bean
public SaTokenManager saTokenManager() {
SaTokenManager manager = new SaTokenManager();
manager.setStrategy(new SaStrategyJwt());
manager.setOnlineManager(new SaOnlineManager());
return manager;
}
}
在线状态的监听与触发
在线状态的监听可以通过在线管理器实现,例如:
import cn.dev33.sa.manager.SaOnlineManager;
public class CustomOnlineManager extends SaOnlineManager {
@Override
public void online(String token, String username, String address) {
// 在线状态触发逻辑
super.online(token, username, address);
}
@Override
public void offline(String token) {
// 下线状态触发逻辑
super.offline(token);
}
}
实战示例:用户在线状态的实时更新
实现一个在线用户管理的示例:
import cn.dev33.sa.SaTokenManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Configuration
public class SaTokenConfig {
@Bean
public SaTokenManager saTokenManager() {
SaTokenManager manager = new SaTokenManager();
manager.setStrategy(new SaStrategyJwt());
manager.setOnlineManager(new CustomOnlineManager());
return manager;
}
}
@RestController
@RequestMapping("/online")
public class OnlineController {
private final SaTokenManager saTokenManager;
public OnlineController(SaTokenManager saTokenManager) {
this.saTokenManager = saTokenManager;
}
@GetMapping("/users")
public String getOnlineUsers() {
return saTokenManager.getOnlineUsers().toString();
}
}
用户登录和登出时会触发在线状态的更新,可以通过/online/users
接口获取在线用户列表。
常见错误处理方法
在项目中,需要对常见的错误进行处理,例如登录失败、Token过期等。可以通过自定义异常处理器来统一处理这些错误。
import cn.dev33.sa.SaTokenManager;
import cn.dev33.sa.exception.SaTokenException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(SaTokenException.class)
public String handleSaTokenException(SaTokenException ex) {
return ex.getMessage();
}
}
日志记录与分析
日志记录可以帮助我们追踪系统运行状态和错误信息。SaToken内置了日志记录功能,可以通过配置日志级别和日志文件路径来控制日志输出。
import cn.dev33.sa.SaTokenManager;
import cn.dev33.sa.strategy.SaStrategyJwt;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SaTokenConfig {
@Bean
public SaTokenManager saTokenManager() {
SaTokenManager manager = new SaTokenManager();
manager.setStrategy(new SaStrategyJwt());
manager.setLogPrint(true); // 开启日志打印
return manager;
}
}
实战示例:错误日志的记录与异常处理
实现一个简单的错误日志记录和异常处理示例:
import cn.dev33.sa.SaTokenManager;
import cn.dev33.sa.exception.SaTokenException;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestController
public class UserController {
private final SaTokenManager saTokenManager;
public UserController(SaTokenManager saTokenManager) {
this.saTokenManager = saTokenManager;
}
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
try {
// 假设密码错误
if (!password.equals("admin123")) {
throw new SaTokenException("密码错误");
}
return saTokenManager.login(username);
} catch (SaTokenException ex) {
return ex.getMessage();
}
}
}
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(SaTokenException.class)
public String handleSaTokenException(SaTokenException ex) {
return ex.getMessage();
}
}
当用户登录失败时,会抛出SaTokenException
,并通过全局异常处理器统一处理错误信息,同时记录日志。
通过以上步骤,你可以实现一个基本的SaToken项目实战,包括用户认证、Token管理、权限控制、在线用户管理以及错误处理与日志记录。希望这些示例代码能够帮助你快速掌握SaToken的使用方法。
共同学习,写下你的评论
评论加载中...
作者其他优质文章