当前位置: 首页 > news >正文

SpringBoot中集成SaToken

SpringBoot中集成SaToken

  • 1. 写一个拦截器
  • 2. 对拦截器的说明&解释
  • 2. 拦截器

1. 写一个拦截器

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * SaToken拦截器
 * <p>
 * 该类的作用是在请求处理前进行权限认证,以确保只有登录用户可以访问受保护的资源
 * 它通过实现HandlerInterceptor接口,使用Spring框架提供的拦截器机制来实现功能
 * <p>
 * href:https://sa-token.cc/doc.html#/
 *
 */
@Component
public class SaTokenInterceptor implements HandlerInterceptor {
    /**
     * 一键控制权限认证开关
     */
    @Value("${sa-token.is-auth}")
    private boolean isAuth;

    /**
     * 在请求处理前进行权限认证
     * <p>
     * 如果权限认证开关打开,该方法会检查用户是否已登录
     *
     * @param request  用于获取请求信息
     * @param response 用于向客户端返回信息
     * @param handler  当前处理请求的处理器
     * @return 如果权限认证通过或未启用权限认证,返回true,继续执行后续的请求处理;否则返回false,中断请求处理
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (isAuth) {
            try {
                // 如果权限认证开启,校验登录状态
                StpUtil.checkLogin();
            } catch (NotLoginException e) {
                // 捕获未登录或 Token 过期的异常,通知前端跳转
                response.setContentType("application/json;charset=UTF-8");
                // 这里设置4001 未授权
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                response.getWriter().write("{\"code\":4001, \"message\":\"未登录或登录已过期\", \"redirect\":\"/auth/inner-login\"}");

                return false;
            }
        }

        return true;
    }
}

saToken的pom依赖

   <!-- Sa-Token权限认证,在线文档:https://sa-token.cc -->
        <dependency>
            <groupId>cn.dev33</groupId>
            <artifactId>sa-token-spring-boot-starter</artifactId>
            <version>1.39.0</version>
        </dependency>

application-dev.yml的配置

# 权限认证框架
sa-token:
  # 一键控制权限认证开关
  is-auth: true
  token-name: token
  # Token 有效期(秒)
  timeout: 2592000
  # 是否允许同一账号多地同时登录
  is-concurrent: true
  # token风格
  token-style: uuid
  # 是否输出操作日志
  is-log: true
  # 不读取cookie,防止Cookie帮你自动提交Token
  is-read-cookie: true

2. 对拦截器的说明&解释

这段代码定义了一个 SaTokenInterceptor 类,它是一个 Spring MVC 的拦截器,用于处理权限认证。拦截器的功能是确保只有已登录的用户能够访问某些受保护的资源。下面是对代码的详细解释:
1.导入的依赖

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
  1. NotLoginException: 这是 Sa-Token 框架中的一个异常,表示用户没有登录或登录状态已过期。
  2. StpUtil: Sa-Token 提供的工具类,包含了处理登录、权限等功能的方法。
  3. @Value: 用于注入配置文件中的属性。
  4. HandlerInterceptor: Spring Web 提供的拦截器接口,用于在请求处理之前、之后或完成时进行拦截和处理。

2.SaTokenInterceptor 类的声明

@Component
public class SaTokenInterceptor implements HandlerInterceptor
  • @Component: 该注解使得 SaTokenInterceptor 成为 Spring 容器管理的 Bean,能够自动注入到 Spring 的上下文中。
  • 实现 HandlerInterceptor 接口: 通过实现 preHandle 方法,我们可以在请求被处理前进行认证。

3.成员变量:权限开关

@Value("${sa-token.is-auth}")
private boolean isAuth;
  • @Value("${sa-token.is-auth}"): 从 application.propertiesapplication.yml 配置文件中读取 sa-token.is-auth 的值并赋给 isAuth。该配置项控制是否启用权限认证。
  • 如果 isAuth 为 true,则进行权限认证。
  • 如果 isAuth 为 false,则跳过权限认证。

4.preHandle 方法:请求前权限认证

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    if (isAuth) {
        try {
            // 如果权限认证开启,校验登录状态
            StpUtil.checkLogin();
        } catch (NotLoginException e) {
            // 捕获未登录或 Token 过期的异常,通知前端跳转
            response.setContentType("application/json;charset=UTF-8");
            // 这里设置4001 未授权
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            response.getWriter().write("{\"code\":4001, \"message\":\"未登录或登录已过期\", \"redirect\":\"/auth/inner-login\"}");

            return false;
        }
    }

    return true;
}
  • preHandle 方法: 这是HandlerInterceptor接口中的一个方法,它在请求处理之前被调用。它可以用来做权限认证、日志记录等操作。如果返回 true,请求会继续向下执行;如果返回 false,则请求会被中断。

2. 拦截器

当然配置了权限肯定也要配置拦截器

import cn.ac.ict.knowledge.graph.common.interceptor.SaTokenInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


@Configuration
public class WebConfig implements WebMvcConfigurer {
    /**
     * 自动注入SaTokenInterceptor,用于拦截请求进行权限验证等操作
     */
    @Autowired
    private SaTokenInterceptor saTokenInterceptor;

    /**
     * 添加拦截器配置
     * 此方法用于向Spring MVC框架注册拦截器,并指定拦截器的拦截路径
     *
     * @param registry 拦截器注册器,用于注册自定义拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 除登陆、注册接口,拦截所有接口
        registry.addInterceptor(saTokenInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/auth/inner-login",
                        "/auth/inner-update",
                        "/menu/get",
                        "/swagger-ui.html",
                        "/v3/api-docs/**",
                        "/swagger-resources/**",
                        "/webjars/**",
                        "/doc.html",
                        "/v*/api-docs**");
    }
}

其实上面应该也要根据是否开启权限判断,是否使用拦截器

 if (isAuth) {  // 根据配置判断是否启用拦截器
        registry.addInterceptor(saTokenInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/auth/inner-login", "/auth/inner-update", "/menu/get", 
                        "/swagger-ui.html", "/v3/api-docs/**", "/swagger-resources/**", 
                        "/webjars/**", "/doc.html", "/v*/api-docs**");
    }

相关文章:

  • vue3开发打年兽功能
  • 【论文笔记】On Generative Agents in Recommendation
  • DeepSeek 本地部署方法介绍
  • 鸡兔同笼问题
  • 20.【线性代数】——坐标系中,平行四边形面积=矩阵的行列式
  • ES快照备份索引数据(已亲测)
  • 数据恢复-01-机械硬盘的物理与逻辑结构
  • 【C语言】第二期——运算符与表达式
  • PMBOK第7版整体架构全面详解
  • AI芯片:科技变革的核心驱动力
  • QT (四)模型/视图 QFileSystemModel,QStringListModel,QStandardItemModel
  • 【生产变更】- 集群中配置SCAN ip的不同端口应用
  • 2步破解官方sublime4最新版本 4192
  • 基于SpringBoot的小区运动中心预约管理系统
  • Redis可视化连接工具RedisDesktopManager的下载与安装
  • 前端:最简单封装nmp插件(组件)过程。(待完善)
  • Spring Bean 生命周期的执行流程
  • shell脚本备份PostgreSQL数据库和库下表
  • 信息安全管理(3):网络安全
  • 基于Matlab实现信道估计仿真(源码)
  • 当智慧农场遇见绿色工厂:百事如何用科技留住春天的味道?
  • “多规合一”改革7年成效如何?自然资源部总规划师亮成绩单
  • 新版城市规划体检评估解读:把城市安全韧性摆在更加突出位置
  • 布局50多个国家和地区,我国科技型企业孵化器数量全球第一
  • 病重老人被要求亲自取钱在农业银行门口去世?株洲警方介入
  • 中国科学院院士、我国航天液体火箭技术专家朱森元逝世