欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot集成Sa-Token實現(xiàn)權(quán)限認證流程入門教程

 更新時間:2025年09月18日 15:16:06   作者:Purse Wind  
本文詳解SpringBoot集成Sa-Token框架的入門步驟,涵蓋依賴添加、配置設(shè)置、攔截器注冊、權(quán)限角色邏輯定義、設(shè)備工具類創(chuàng)建及登錄/注銷功能改造,通過注解實現(xiàn)鑒權(quán),解決權(quán)限認證問題,感興趣的朋友跟隨小編一起看看吧

摘要: 本文介紹SpringBoot集成 Sa-Token 框架的步驟,包括添加依賴、配置文件設(shè)置、注冊攔截器。還講解了權(quán)限與角色獲取邏輯定義、設(shè)備工具類創(chuàng)建,以及登錄、用戶信息獲取、注銷功能的改造,最后提及用注解實現(xiàn)鑒權(quán)。

Sa-token 介紹

Sa-Token 是一個輕量級 Java 權(quán)限認證框架,主要解決:登錄認證權(quán)限認證、單點登錄、OAuth2.0分布式Session會話等一系列權(quán)限相關(guān)問題。(本節(jié)僅講解入門內(nèi)容)

SpringBoot 集成 Sa-Token

1.添加依賴

<!-- Sa-Token 權(quán)限認證,在線文檔:https://sa-token.cc -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.44.0</version>
</dependency>

注:如果你使用的是 SpringBoot 3.x,只需要將 sa-token-spring-boot-starter 修改為 sa-token-spring-boot3-starter 即可。

2.設(shè)置配置文件

spring:
  application:
    name: ai-codegen-microservice
sa-token: 
    # token 名稱(同時也是 cookie 名稱)
    token-name: satoken
    # token 有效期(單位:秒) 默認30天,-1 代表永久有效
    timeout: 2592000
    # token 最低活躍頻率,如果 token 超過此時間沒有訪問系統(tǒng)就會被凍結(jié),默認-1 代表不限制,永不凍結(jié)
    active-timeout: -1
    # 是否允許同一賬號多地同時登錄 (為 true 時允許一起登錄, 為 false 時新登錄擠掉舊登錄)
    is-concurrent: true
    # 在多人登錄同一賬號時,是否共用一個 token (為 true 時所有登錄共用一個 token, 為 false 時每次登錄新建一個 token)
    is-share: false
    # token 風(fēng)格(默認可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
    token-style: uuid
    # 是否輸出操作日志 
    is-log: true

3.創(chuàng)建Controller測試類

/**
 * 測試 Sa-Token 框架實現(xiàn)用戶登錄
 */
@RestController
@RequestMapping("/test/user/")
public class TestSaTokenLoginController {
    // 測試登錄,瀏覽器訪問: http://localhost:8101/api/test/user/doLogin?username=zhang&password=123456
    @RequestMapping("doLogin")
    public String doLogin(String username, String password) {
        // 此處僅作模擬示例,真實項目需要從數(shù)據(jù)庫中查詢數(shù)據(jù)進行比對
        if ("zhang".equals(username) && "123456".equals(password)) {
            StpUtil.login(10001);
            return "登錄成功";
        }
        return "登錄失敗";
    }
    // 查詢登錄狀態(tài),瀏覽器訪問: http://localhost:8101/api/test/user/isLogin
    @RequestMapping("isLogin")
    public String isLogin() {
        return "當(dāng)前會話是否登錄:" + StpUtil.isLogin();
    }
}

然后可以通過直接訪問接口地址來驗證。

后端開發(fā)實現(xiàn)登錄校驗與權(quán)限檢驗

1.添加依賴并設(shè)置配置文件

2.注冊 Sa-Token 攔截器

新建 satoken 包,在里面新建配置類 SaTokenConfigure,注冊攔截器:

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

然后就可以?使用注解鑒權(quán)了,比?如下列注解,可以平‏替我們項目中已經(jīng)寫‌的鑒權(quán)注解:

// 登錄校驗:只有登錄之后才能進入該方法 
@SaCheckLogin                        
@RequestMapping("info")
public String info() {
    return "查詢用戶信息";
}
// 角色校驗:必須具有指定角色才能進入該方法 
@SaCheckRole("super-admin")        
@RequestMapping("add")
public String add() {
    return "用戶增加";
}

3.定義權(quán)限與角色獲取邏輯

部分接口需要特?定的用戶權(quán)限或?qū)?yīng)的角色才能?訪問,那怎么知道當(dāng)前登錄用戶‏具有哪些權(quán)限或角色呢?   ‌              ‏               

按照 Sa-Token 的開發(fā)模式,我們需要新建一個類,實現(xiàn) StpInterface 接口。該接口提供了獲取當(dāng)前登錄用戶的權(quán)限和角色的方法,在每次調(diào)用鑒權(quán)代碼時,都會執(zhí)行接口中的方法。

satoken 包下新建類,代碼如下:

@Component // 保證此類被 SpringBoot 掃描,完成 Sa-Token 的自定義權(quán)限驗證擴展 
public class StpInterfaceImpl implements StpInterface {
    /**
     * 返回一個賬號所擁有的角色標(biāo)識集合 (權(quán)限與角色可分開校驗)
     */
    @Override
    public List<String> getRoleList(Object loginId, String s) {
        // 從當(dāng)前登錄用戶信息中獲取角色
        User user = (User) StpUtil.getSessionByLoginId(loginId).get(USER_LOGIN_STATE);
        return Collections.singletonList(user.getUserRole());
    }
}

4.新建設(shè)備信息獲取工具類

/**
 * 設(shè)備工具類
 */
public class DeviceUtils {
    /**
     * 根據(jù)請求獲取設(shè)備信息
     **/
    public static String getRequestDevice(HttpServletRequest request) {
        String userAgentStr = request.getHeader(Header.USER_AGENT.toString());
        // 使用 Hutool 解析 UserAgent
        UserAgent userAgent = UserAgentUtil.parse(userAgentStr);
        ThrowUtils.throwIf(userAgent == null, ErrorCode.OPERATION_ERROR, "非法請求");
        // 默認值是 PC
        String device = "pc";
        // 是否為小程序
        if (isMiniProgram(userAgentStr)) {
            device = "miniProgram";
        } else if (isPad(userAgentStr)) {
            // 是否為 Pad
            device = "pad";
        } else if (userAgent.isMobile()) {
            // 是否為手機
            device = "mobile";
        }
        return device;
    }
    /**
     * 判斷是否是小程序
     * 一般通過 User-Agent 字符串中的 "MicroMessenger" 來判斷是否是微信小程序
     **/
    private static boolean isMiniProgram(String userAgentStr) {
        // 判斷 User-Agent 是否包含 "MicroMessenger" 表示是微信環(huán)境
        return StrUtil.containsIgnoreCase(userAgentStr, "MicroMessenger")
                && StrUtil.containsIgnoreCase(userAgentStr, "MiniProgram");
    }
    /**
     * 判斷是否為平板設(shè)備
     * 支持 iOS(如 iPad)和 Android 平板的檢測
     **/
    private static boolean isPad(String userAgentStr) {
        // 檢查 iPad 的 User-Agent 標(biāo)志
        boolean isIpad = StrUtil.containsIgnoreCase(userAgentStr, "iPad");
        // 檢查 Android 平板(包含 "Android" 且不包含 "Mobile")
        boolean isAndroidTablet = StrUtil.containsIgnoreCase(userAgentStr, "Android")
                && !StrUtil.containsIgnoreCase(userAgentStr, "Mobile");
        // 如果是 iPad 或 Android 平板,則返回 true
        return isIpad || isAndroidTablet;
    }
}

5.改造登錄接口

修改userLogin 方法中的邏輯,需要給 Sa-Token 設(shè)置登錄態(tài),保存登錄用戶信息。

// Sa-Token 登錄,并指定設(shè)備,同端登錄互斥
StpUtil.login(user.getId(), DeviceUtils.getRequestDevice(request));
StpUtil.getSession().set(USER_LOGIN_STATE, user);

6.改造獲取用戶信息的邏輯

修改getLoginUser ,不再從 request.getSession() 中獲取登錄用戶的 id,改為從 Sa-Token 中獲取。

@Override
public User getLoginUser(HttpServletRequest request) {
    // 先判斷是否已登錄
    Object loginUserId = StpUtil.getLoginIdDefaultNull();
    if (loginUserId == null) {
        throw new BusinessException(ErrorCode.NOT_LOGIN_ERROR);
    }
    // 從數(shù)據(jù)庫查詢(追求性能的話可以注釋,直接走緩存)
    User currentUser = this.getById((String) loginUserId);
    if (currentUser == null) {
        throw new BusinessException(ErrorCode.NOT_LOGIN_ERROR);
    }
    return currentUser;
}

如果用戶信?息幾乎很少修改,可以?不查數(shù)據(jù)庫,直接從 ‏Sa-Token 的‌ Session 中‏獲取之前保存的用戶登錄態(tài):

@Override
public User getLoginUser(HttpServletRequest request) {
    // 先判斷是否已登錄
    Object loginId = StpUtil.getLoginIdDefaultNull();
    if (Objects.isNull(loginId)) {
        throw new BusinessException(ErrorCode.NOT_LOGIN_ERROR);
    }
    return (User) StpUtil.getSessionByLoginId(loginId).get(USER_LOGIN_STATE);
}

7.改造用戶注銷功能

改為調(diào)用 Sa-Token 的注銷方法,移除登錄態(tài):

@Override
public boolean userLogout(HttpServletRequest request) {
    StpUtil.checkLogin();
    // 移除登錄態(tài)
    StpUtil.logout();
    return true;
}

8. 替換鑒權(quán)注解

如果是管理員權(quán)限的接口,打上以下注解:

@SaCheckRole(UserConstant.ADMIN_ROLE)

到此這篇關(guān)于SpringBoot集成Sa-Token實現(xiàn)權(quán)限認證流程入門教程的文章就介紹到這了,更多相關(guān)SpringBoot Sa-Token權(quán)限認證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論