为了账号安全,请及时绑定邮箱和手机立即绑定

SaToken项目实战:从入门到上手教程

标签:
Java 架构 安全
概述

本文详细介绍了SaToken项目实战,涵盖从安装配置到用户认证、Token管理、权限控制、在线用户管理以及错误处理与日志记录的全过程。通过多个示例代码,帮助读者快速掌握SaToken的使用方法。SaToken项目实战不仅适用于Java等后端语言,还能帮助企业快速搭建安全的权限控制系统。

SaToken项目实战:从入门到上手教程
SaToken简介与安装

什么是SaToken

SaToken是一个基于JWT的Token管理框架,用于实现权限管理、登录认证、Token管理等功能。它适用于Java、.NET、PHP等后端语言,能够帮助企业快速搭建安全的权限控制系统。SaToken的核心在于Token的生成、存储、验证和过期处理,通过这些特性,可以实现登录认证、权限控制等功能。

SaToken主要功能介绍

SaToken主要功能包括:

  1. Token生成与验证:用户登录时生成Token,每次请求时进行Token验证,确保请求来自合法的用户。
  2. 权限控制:基于Token的权限控制,支持细粒度权限管理。
  3. 在线用户管理:实时管理在线用户,提供在线状态更新、在线用户统计等功能。
  4. 错误处理与日志记录:提供统一的错误处理机制和日志记录功能。

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);
    }
}

用户登录流程详解

用户登录流程如下:

  1. 用户通过前端提交用户名和密码。
  2. 后端接收请求并验证用户名和密码是否正确。
  3. 如果验证通过,生成Token并返回给前端。
  4. 前端保存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的生成通常在用户登录时进行,使用SaTokenManagerlogin方法生成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验证通常在每个接口调用时进行。使用SaTokenManagergetLoginUser方法可以验证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的使用方法。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消