最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Sa-Token 基礎(chǔ)及 Spring Boot 集成實(shí)戰(zhàn)指南

 更新時(shí)間:2025年07月26日 11:43:48   作者:張道寧  
Sa-Token是輕量級(jí)Java權(quán)限認(rèn)證框架,支持登錄、權(quán)限、單點(diǎn)登錄等場(chǎng)景,集成SpringBoot簡(jiǎn)便,提供豐富注解和模塊化設(shè)計(jì),相比Shiro和SpringSecurity更易用且適合中小型項(xiàng)目,注重安全與擴(kuò)展性,本文給大家介紹Sa-Token基礎(chǔ)及Spring Boot集成實(shí)戰(zhàn)指南,感興趣的一起看看吧

一、Sa-Token 簡(jiǎn)介

Sa-Token 是一個(gè)輕量級(jí) Java 權(quán)限認(rèn)證框架,主要解決登錄認(rèn)證、權(quán)限認(rèn)證、單點(diǎn)登錄、OAuth2.0、分布式 Session 會(huì)話等一系列與權(quán)限相關(guān)的問(wèn)題。相比于 Shiro 和 Spring Security,Sa-Token 具有以下特點(diǎn):

  1. 簡(jiǎn)單易用:API 設(shè)計(jì)直觀,學(xué)習(xí)成本低
  2. 功能全面:覆蓋大部分認(rèn)證授權(quán)場(chǎng)景
  3. 輕量高效:不依賴復(fù)雜設(shè)計(jì),性能優(yōu)異
  4. 模塊化設(shè)計(jì):可按需引入功能模塊
  5. 良好擴(kuò)展性:支持自定義各種組件

二、核心概念

1. 登錄認(rèn)證流程

用戶登錄 -> 生成Token -> 存儲(chǔ)Token -> 返回給客戶端
客戶端攜帶Token -> 服務(wù)器驗(yàn)證Token -> 訪問(wèn)受保護(hù)資源

2. 核心組件

  • StpUtil:核心工具類,提供登錄、注銷、權(quán)限校驗(yàn)等操作
  • SaTokenConfig:配置類,可自定義各種參數(shù)
  • SaInterceptor:攔截器,實(shí)現(xiàn)路由攔截鑒權(quán)
  • SaTokenDao:Token 持久層接口,默認(rèn)內(nèi)存實(shí)現(xiàn),可擴(kuò)展為 Redis

3. 主要功能

  • 登錄認(rèn)證
  • 權(quán)限認(rèn)證(角色/權(quán)限)
  • Session 管理
  • 踢人下線
  • 多賬號(hào)體系
  • 單點(diǎn)登錄
  • 模擬他人賬號(hào)
  • 臨時(shí)身份切換

三、Spring Boot 集成實(shí)戰(zhàn)

1. 添加依賴

<!-- Sa-Token 核心包 -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>最新版本</version>
</dependency>
<!-- 如果使用Redis持久化 -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-dao-redis</artifactId>
    <version>最新版本</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

2. 基礎(chǔ)配置

# application.yml
sa-token:
  # token名稱 (同時(shí)也是cookie名稱)
  token-name: satoken
  # token有效期,單位s 默認(rèn)30天
  timeout: 2592000
  # token臨時(shí)有效期 (指定時(shí)間內(nèi)無(wú)操作就視為token過(guò)期) 單位: 秒
  activity-timeout: -1
  # 是否允許同一賬號(hào)并發(fā)登錄 (為true時(shí)允許一起登錄, 為false時(shí)新登錄擠掉舊登錄)
  is-concurrent: true
  # 在多人登錄同一賬號(hào)時(shí),是否共用一個(gè)token (為true時(shí)所有登錄共用一個(gè)token, 為false時(shí)每次登錄新建一個(gè)token)
  is-share: true
  # token風(fēng)格
  token-style: uuid
  # 是否輸出操作日志
  is-log: true

3. 登錄認(rèn)證實(shí)現(xiàn)

@RestController
@RequestMapping("/user/")
public class UserController {
    @PostMapping("doLogin")
    public SaResult doLogin(String username, String password) {
        // 模擬數(shù)據(jù)庫(kù)校驗(yàn)
        if("admin".equals(username) && "123456".equals(password)) {
            // 登錄成功,生成Token
            StpUtil.login(10001);
            return SaResult.ok("登錄成功").setData(StpUtil.getTokenInfo());
        }
        return SaResult.error("登錄失敗");
    }
    // 查詢登錄狀態(tài)
    @GetMapping("isLogin")
    public SaResult isLogin() {
        return SaResult.ok("是否登錄:" + StpUtil.isLogin());
    }
    // 退出登錄
    @GetMapping("logout")
    public SaResult logout() {
        StpUtil.logout();
        return SaResult.ok();
    }
}

4. 權(quán)限認(rèn)證實(shí)現(xiàn)

@RestController
@RequestMapping("/admin/")
public class AdminController {
    // 權(quán)限校驗(yàn):必須具有admin權(quán)限才能進(jìn)入
    @SaCheckPermission("admin")
    @GetMapping("menu")
    public SaResult menu() {
        return SaResult.data("管理員菜單");
    }
    // 角色校驗(yàn):必須具有super-admin角色才能進(jìn)入
    @SaCheckRole("super-admin")
    @GetMapping("settings")
    public SaResult settings() {
        return SaResult.data("系統(tǒng)設(shè)置");
    }
    // 二級(jí)認(rèn)證:必須輸入密碼進(jìn)行二次驗(yàn)證后才能進(jìn)入
    @SaCheckSafe()
    @GetMapping("criticalOperation")
    public SaResult criticalOperation() {
        return SaResult.data("關(guān)鍵操作");
    }
}

5. 全局?jǐn)r截器配置

@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
    // 注冊(cè)Sa-Token的注解攔截器,打開(kāi)注解式鑒權(quán)功能
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注冊(cè)注解攔截器
        registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");
    }
}

四、進(jìn)階功能

1. Redis 集成(分布式會(huì)話)

# application.yml
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 
    database: 0
sa-token:
  # 配置Token持久化到Redis
  is-share: true
  is-read-body: false
  is-read-head: true
  is-v: false
  token-prefix: "satoken:"
  jwt-secret-key: null
  id-token-timeout: 86400
  dao: "redis"

2. 自定義會(huì)話管理

@Component
public class CustomSaTokenDao extends SaTokenDaoDefaultImpl {
    // 重寫(xiě)數(shù)據(jù)訪問(wèn)層方法,例如使用MongoDB存儲(chǔ)
    @Override
    public String get(String key) {
        // 自定義實(shí)現(xiàn)
        return super.get(key);
    }
    @Override
    public void set(String key, String value, long timeout) {
        // 自定義實(shí)現(xiàn)
        super.set(key, value, timeout);
    }
}

3. 注解鑒權(quán)

Sa-Token 提供豐富的注解用于權(quán)限控制:

  • @SaCheckLogin: 登錄校驗(yàn)
  • @SaCheckRole("admin"): 角色校驗(yàn)
  • @SaCheckPermission("user:add"): 權(quán)限校驗(yàn)
  • @SaCheckSafe: 二級(jí)認(rèn)證校驗(yàn)
  • @SaCheckBasic: HttpBasic校驗(yàn)

4. 路由攔截鑒權(quán)

@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SaInterceptor(handler -> {
            // 登錄校驗(yàn) -- 攔截所有路由
            SaRouter.match("/**").check(r -> StpUtil.checkLogin());
            // 角色校驗(yàn) -- 攔截以 admin 開(kāi)頭的路由
            SaRouter.match("/admin/**").check(r -> StpUtil.checkRole("admin"));
            // 權(quán)限校驗(yàn) -- 不同模塊校驗(yàn)不同權(quán)限
            SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
            SaRouter.match("/order/**", r -> StpUtil.checkPermission("order"));
        })).addPathPatterns("/**");
    }
}

五、最佳實(shí)踐

  1. Token 安全

    • 使用 HTTPS
    • 設(shè)置合理的 token 有效期
    • 避免 token 在 URL 中傳輸
    • 實(shí)現(xiàn) token 續(xù)期機(jī)制
  2. 權(quán)限設(shè)計(jì)

    • 遵循最小權(quán)限原則
    • 使用 RBAC (基于角色的訪問(wèn)控制) 模型
    • 實(shí)現(xiàn)權(quán)限緩存機(jī)制
  3. 性能優(yōu)化

    • 對(duì)于分布式系統(tǒng)使用 Redis 存儲(chǔ) token
    • 合理設(shè)置 token 的過(guò)期時(shí)間
    • 實(shí)現(xiàn)本地緩存減少持久層訪問(wèn)
  4. 監(jiān)控與日志

    • 記錄關(guān)鍵認(rèn)證操作
    • 監(jiān)控異常登錄行為
    • 實(shí)現(xiàn)登錄設(shè)備管理

六、常見(jiàn)問(wèn)題解決方案

  1. Token 失效問(wèn)題

    • 檢查 token 過(guò)期時(shí)間設(shè)置
    • 驗(yàn)證 token 持久化是否正常工作
    • 檢查是否有并發(fā)登錄沖突
  2. 跨域問(wèn)題

    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowedMethods("*")
                    .allowedHeaders("*")
                    .exposedHeaders("satoken"); // 重點(diǎn)暴露satoken頭
        }
    }
  3. 自定義響應(yīng)格式

    @RestControllerAdvice
    public class GlobalExceptionHandler {
        // 攔截所有未處理的SaToken異常
        @ExceptionHandler(SaTokenException.class)
        public SaResult handlerSaTokenException(SaTokenException e) {
            return SaResult.error(e.getMessage());
        }
    }
  4. 多賬號(hào)體系

    // 對(duì)于不同的賬號(hào)體系,可以使用不同的StpUtil
    StpUtil.stpLogic("user").login(10001);  // 用戶體系登錄
    StpUtil.stpLogic("admin").login(1);     // 管理員體系登錄

七、總結(jié)

Sa-Token 作為一個(gè)輕量級(jí)的權(quán)限認(rèn)證框架,通過(guò)簡(jiǎn)單的 API 設(shè)計(jì)和豐富的功能,能夠滿足大多數(shù)應(yīng)用的認(rèn)證授權(quán)需求。與 Spring Boot 的集成非常簡(jiǎn)便,通過(guò)少量配置即可實(shí)現(xiàn)強(qiáng)大的權(quán)限控制功能。

相比傳統(tǒng)的 Shiro 和 Spring Security,Sa-Token 的學(xué)習(xí)曲線更為平緩,且針對(duì)常見(jiàn)場(chǎng)景提供了開(kāi)箱即用的解決方案。特別是對(duì)于中小型項(xiàng)目,Sa-Token 能夠顯著降低權(quán)限系統(tǒng)的開(kāi)發(fā)成本。

在實(shí)際項(xiàng)目中,建議根據(jù)業(yè)務(wù)需求選擇合適的持久化方案(內(nèi)存或 Redis),合理設(shè)計(jì)權(quán)限模型,并遵循安全最佳實(shí)踐,以構(gòu)建安全可靠的認(rèn)證授權(quán)系統(tǒng)。

到此這篇關(guān)于Sa-Token 基礎(chǔ)及 Spring Boot 集成實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Spring Boot 集成內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析java 歸并排序算法

    淺析java 歸并排序算法

    這篇文章主要簡(jiǎn)單介紹了java 歸并排序算法的工作原理及代碼,需要的朋友可以參考下
    2015-02-02
  • SpringBoot中的@DependsOn注解詳解

    SpringBoot中的@DependsOn注解詳解

    這篇文章主要介紹了SpringBoot中的@DependsOn注解詳解,
    2023-08-08
  • IDEA如何使用spring-Initializr快速搭建SpringBoot

    IDEA如何使用spring-Initializr快速搭建SpringBoot

    這篇文章主要介紹了IDEA如何使用spring-Initializr快速搭建SpringBoot問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java中ReentrantLock和ReentrantReadWriteLock的原理

    Java中ReentrantLock和ReentrantReadWriteLock的原理

    這篇文章主要介紹了Java中ReentrantLock和ReentrantReadWriteLock的原理,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-09-09
  • java實(shí)現(xiàn)XML與JSON轉(zhuǎn)換的便捷實(shí)用方法

    java實(shí)現(xiàn)XML與JSON轉(zhuǎn)換的便捷實(shí)用方法

    這篇文章主要為大家介紹了java實(shí)現(xiàn)XML與JSON轉(zhuǎn)換的便捷實(shí)用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 解析Java的JVM以及類與對(duì)象的概念

    解析Java的JVM以及類與對(duì)象的概念

    這篇文章主要介紹了解析Java的JVM以及類與對(duì)象的概念,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • SpringCloud Sleuth 分布式鏈路追蹤實(shí)踐指南

    SpringCloud Sleuth 分布式鏈路追蹤實(shí)踐指南

    SpringCloud Sleuth是一個(gè)用于分布式追蹤的組件,通過(guò)為每個(gè)請(qǐng)求生成唯一的TraceID和SpanID,記錄請(qǐng)求在多個(gè)微服務(wù)中的流轉(zhuǎn)情況,本文重點(diǎn)給大家介紹SpringCloud Sleuth 分布式鏈路追蹤的實(shí)例講解,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • springboot2.3 整合mybatis-plus 高級(jí)功能及用法詳解

    springboot2.3 整合mybatis-plus 高級(jí)功能及用法詳解

    這篇文章主要介紹了springboot2.3 整合mybatis-plus 高級(jí)功能,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java this關(guān)鍵字的使用詳解

    Java this關(guān)鍵字的使用詳解

    this 關(guān)鍵字是 Java 常用的關(guān)鍵字,可用于任何實(shí)例方法內(nèi)指向當(dāng)前對(duì)象,也可指向?qū)ζ湔{(diào)用當(dāng)前方法的對(duì)象,或者在需要當(dāng)前類型對(duì)象引用時(shí)使用
    2021-11-11
  • ssm實(shí)現(xiàn)分頁(yè)查詢的實(shí)例

    ssm實(shí)現(xiàn)分頁(yè)查詢的實(shí)例

    下面小編就為大家?guī)?lái)一篇ssm實(shí)現(xiàn)分頁(yè)查詢的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11

最新評(píng)論

金堂县| 临桂县| 梧州市| 庆城县| 武夷山市| 图片| 垦利县| 榆林市| 阿鲁科尔沁旗| 松原市| 台东市| 罗源县| 甘孜| 娄烦县| 栖霞市| 大悟县| 卓尼县| 区。| 乳源| 平陆县| 昔阳县| 图木舒克市| 昭觉县| 仪陇县| 邮箱| 邻水| 阳江市| 当阳市| 旺苍县| 广汉市| 武隆县| 陕西省| 琼结县| 固始县| 铜鼓县| 东安县| 武宣县| 柳林县| 张家口市| 二手房| 师宗县|