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

springboot整合Sa-Token實現(xiàn)登錄認證和權(quán)限校驗的詳細流程

 更新時間:2025年09月18日 15:07:03   作者:張喬24  
Sa-Token是國產(chǎn)輕量級權(quán)限認證框架,支持登錄、權(quán)限校驗、單點登錄及分布式會話,配置簡便且API設(shè)計直觀,相比Spring Security更易上手,適合快速實現(xiàn)安全功能,助力國產(chǎn)開源發(fā)展,感興趣的朋友跟隨小編一起看看吧

目前在國內(nèi)的后端開發(fā)中,常用的安全框架有spring security、shiro?,F(xiàn)在,介紹一款由國人開發(fā)的安全框架Sa-Token。這個框架完全由國人開發(fā),所提供的Api文檔和一些設(shè)置都是比較符合國人的開發(fā)習慣的,本次就來介紹一下如何在spring boot框架中整合Sa-Token框架,以實現(xiàn)我們最常使用的登錄認證和權(quán)限校驗;

Sa-Token的官網(wǎng)地址如下:
Sa-Token

Sa-Token 是由國人開發(fā)的 一個輕量級 Java 權(quán)限認證框架,主要解決:登錄認證、權(quán)限認證單點登錄、OAuth2.0分布式Session會話微服務(wù)網(wǎng)關(guān)鑒權(quán) 等一系列權(quán)限相關(guān)問題。

版本:spring boot3.15、Sa-Token1.37.0

1、新建一個spring boot項目,并導入一些起始的依賴:

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.32</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.18</version>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
            <version>4.3.0</version>
        </dependency>
        <!-- Sa-Token 權(quán)限認證,在線文檔:https://sa-token.cc -->
        <dependency>
            <groupId>cn.dev33</groupId>
            <artifactId>sa-token-spring-boot3-starter</artifactId>
            <version>1.37.0</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

2、新建五張數(shù)據(jù)表,來展示登錄認證和權(quán)限校驗:

1、用戶表

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL UNIQUE,
  password VARCHAR(100) NOT NULL,
  email VARCHAR(100) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

2、角色表

CREATE TABLE roles (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL UNIQUE,
  description VARCHAR(255),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

3、權(quán)限表

CREATE TABLE permissions (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL UNIQUE,
  description VARCHAR(255),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

4、用戶角色表

CREATE TABLE user_roles (
  id INT AUTO_INCREMENT PRIMARY KEY,
  user_id INT NOT NULL,
  role_id INT NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (user_id) REFERENCES users(id),
  FOREIGN KEY (role_id) REFERENCES roles(id)
);

5、角色權(quán)限表

CREATE TABLE role_permissions (
  id INT AUTO_INCREMENT PRIMARY KEY,
  role_id INT NOT NULL,
  permission_id INT NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (role_id) REFERENCES roles(id),
  FOREIGN KEY (permission_id) REFERENCES permissions(id)
);

3、現(xiàn)在我們開始進行基于Sa-Token進行的登錄校驗和權(quán)限認證:

與spring security不同的是,引入了Sa-Token的依賴之后。并不會自動生效,需要我們自己編寫相應的邏輯代碼;

寫一個TestController,用來進行測試;

@RestController
@RequestMapping("/test")
public class TestController {
    @GetMapping("/hello")
    public String hello() {
        System.out.println("說hello啊");
        return "test接口的hello";
    }
}

我們現(xiàn)在啟動項目,并訪問/test/hello接口,發(fā)現(xiàn)能夠正常訪問。這一點與spring security是不同的,spring security默認會攔截所有請求;

Sa-Token已經(jīng)為我們編寫了很多我們經(jīng)常使用的功能,我們只需要在yml配置文件中進行配置即可。以下是一些常用的配置:

############## Sa-Token 配置 (文檔: https://sa-token.cc) ##############
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: true
    # token 風格(默認可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
    token-style: uuid
    # 是否輸出操作日志 
    is-log: true

3.1、登錄認證:

使用Sa-Token進行登錄認證是非常簡單的,只需要一句代碼就可以搞定:

// 會話登錄:參數(shù)填寫要登錄的賬號id,建議的數(shù)據(jù)類型:long | int | String, 不可以傳入復雜類型,如:User、Admin 等等
StpUtil.login(Object id);     

只此一句代碼,便可以使會話登錄成功,實際上,Sa-Token 在背后做了大量的工作,包括但不限于:

  1. 檢查此賬號是否之前已有登錄;
  2. 為賬號生成 Token 憑證與 Session 會話;
  3. 記錄 Token 活躍時間;
  4. 通知全局偵聽器,xx 賬號登錄成功;
  5. 將 Token 注入到請求上下文;
  6. 等等其它工作……

我們暫時不需要完整了解整個登錄過程,只需要記住關(guān)鍵一點:Sa-Token 為這個賬號創(chuàng)建了一個Token憑證,且通過 Cookie 上下文返回給了前端。

一個登錄接口:

@Autowired
    IUsersService usersService;
    @PostMapping("/login")
public SaResult login(String username, String password){
//根據(jù)用戶名從數(shù)據(jù)庫中查詢
        Users users = usersService.getOne(new LambdaQueryWrapper<Users>().eq(Users::getUsername, username));
        if(users == null){
            return SaResult.error("用戶名不存在");
        }
        if(!users.getPassword().equals(password)){
    return SaResult.error("密碼錯誤");
    }
//根據(jù)用戶id登錄
        StpUtil.login(users.getId());
        return SaResult.ok("登錄成功");
    }

運行檢驗:

發(fā)現(xiàn)確實能夠登錄成功。

此處僅僅做了會話登錄,但并沒有主動向前端返回 token 信息。 是因為不需要嗎?嚴格來講是需要的,只不過 StpUtil.login(id) 方法利用了 Cookie 自動注入的特性,省略了你手寫返回 token 的代碼。

如果你對 Cookie 功能還不太了解,也不用擔心,我們會在之后的 [ 前后端分離 ] 章節(jié)中詳細的闡述 Cookie 功能,現(xiàn)在你只需要了解最基本的兩點:

  • Cookie 可以從后端控制往瀏覽器中寫入 token 值。
  • Cookie 會在前端每次發(fā)起請求時自動提交 token 值。

因此,在 Cookie 功能的加持下,我們可以僅靠 StpUtil.login(id) 一句代碼就完成登錄認證。

除了登錄方法,我們還需要:

// 當前會話注銷登錄
StpUtil.logout();
// 獲取當前會話是否已經(jīng)登錄,返回true=已登錄,false=未登錄
StpUtil.isLogin();
// 檢驗當前會話是否已經(jīng)登錄, 如果未登錄,則拋出異常:`NotLoginException`
StpUtil.checkLogin();

異常 NotLoginException 代表當前會話暫未登錄,可能的原因有很多: 前端沒有提交 token、前端提交的 token 是無效的、前端提交的 token 已經(jīng)過期 …… 等等

還有一些登錄過程中常用的方法:

// 獲取當前會話賬號id, 如果未登錄,則拋出異常:`NotLoginException`
StpUtil.getLoginId();
// 類似查詢API還有:
StpUtil.getLoginIdAsString();    // 獲取當前會話賬號id, 并轉(zhuǎn)化為`String`類型
StpUtil.getLoginIdAsInt();       // 獲取當前會話賬號id, 并轉(zhuǎn)化為`int`類型
StpUtil.getLoginIdAsLong();      // 獲取當前會話賬號id, 并轉(zhuǎn)化為`long`類型
// ---------- 指定未登錄情形下返回的默認值 ----------
// 獲取當前會話賬號id, 如果未登錄,則返回 null 
StpUtil.getLoginIdDefaultNull();
// 獲取當前會話賬號id, 如果未登錄,則返回默認值 (`defaultValue`可以為任意類型)
StpUtil.getLoginId(T defaultValue);
// 獲取當前會話的 token 值
StpUtil.getTokenValue();
// 獲取當前`StpLogic`的 token 名稱
StpUtil.getTokenName();
// 獲取指定 token 對應的賬號id,如果未登錄,則返回 null
StpUtil.getLoginIdByToken(String tokenValue);
// 獲取當前會話剩余有效期(單位:s,返回-1代表永久有效)
StpUtil.getTokenTimeout();
// 獲取當前會話的 token 信息參數(shù)
StpUtil.getTokenInfo();

3.1.1前后端分離模式下的登錄(無cookie模式)

無 Cookie 模式:特指不支持 Cookie 功能的終端,通俗來講就是我們常說的 —— 前后端分離模式。

常規(guī) Web 端鑒權(quán)方法,一般由 Cookie模式 完成,而 Cookie 有兩個特性:

  1. 可由后端控制寫入。
  2. 每次請求自動提交。

這就使得我們在前端代碼中,無需任何特殊操作,就能完成鑒權(quán)的全部流程(因為整個流程都是后端控制完成的)

而在app、小程序等前后端分離場景中,一般是沒有 Cookie 這一功能的,此時大多數(shù)人都會一臉懵逼,咋進行鑒權(quán)?。?/p>

見招拆招,其實答案很簡單:

  • 不能后端控制寫入了,就前端自己寫入。(后端將登錄成功之后生成的Token 傳遞到前端
  • 每次請求不能自動提交了,那就手動提交。(前端將登陸成功后獲取的Token封裝到請求頭中每次請求時都攜帶,后端將其讀取出來,并判斷用戶信息

修改我們之前寫的登錄接口,返回token給前端;

 @PostMapping("/login")
public SaResult login(String username, String password){
//根據(jù)用戶名從數(shù)據(jù)庫中查詢
        Users users = usersService.getOne(new LambdaQueryWrapper<Users>().eq(Users::getUsername, username));
        if(users == null){
            return SaResult.error("用戶名不存在");
        }
        if(!users.getPassword().equals(password)){
    return SaResult.error("密碼錯誤");
    }
//根據(jù)用戶id登錄,第1步,先登錄上
        StpUtil.login(users.getId());
        // 第2步,獲取 Token  相關(guān)參數(shù) 
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        // 第3步,返回給前端 
        return SaResult.data(tokenInfo);
    }

在進行一次登錄:

可以看到登錄成功之后,返回了很多相關(guān)的數(shù)據(jù),而我們的token也在其中,那么前端就可以將token取出來放到一個狀態(tài)管理器(pinia中),并且在每次請求時都將token放在請求頭中。

如果你對 Cookie 非常了解,那你就會明白,所謂 Cookie ,本質(zhì)上就是一個特殊的header參數(shù)而已, 而既然它只是一個 header 參數(shù),我們就能手動模擬實現(xiàn)它,從而完成鑒權(quán)操作。

3.1.2路由攔截鑒權(quán):

假設(shè)我們有如下需求:

項目中所有接口均需要登錄認證,只有 “登錄接口” 本身對外開放

我們怎么實現(xiàn)呢?給每個接口加上鑒權(quán)注解?手寫全局攔截器?似乎都不是非常方便。

在這個需求中我們真正需要的是一種基于路由攔截的鑒權(quán)模式,那么在Sa-Token怎么實現(xiàn)路由攔截鑒權(quán)呢?

@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
    // 注冊攔截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注冊 Sa-Token 攔截器,校驗規(guī)則為 StpUtil.checkLogin() 登錄校驗。
        registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
                .addPathPatterns("/**")
                .excludePathPatterns("/users/login");
    }
}

以上代碼,我們注冊了一個基于 StpUtil.checkLogin() 的登錄校驗攔截器,并且排除了/user/login接口用來開放登錄(除了/user/login以外的所有接口都需要登錄才能訪問)這就與我們spring security有了一點點相似了,因為spring security默認的就是所有的接口都被攔截到。

我們再啟動項目,并訪問我們最開始寫的/test/hello接口;

可以看到這個接口被攔截了。那么我們帶上之前登錄成功,生成的token之后再去訪問呢?

可以看到我們成功訪問了這個接口;

new SaInterceptor(handle -> StpUtil.checkLogin()) 是最簡單的寫法,代表只進行登錄校驗功能。實際上Sa-Token還可以實現(xiàn)一些更詳細的校驗規(guī)則,在Sa-Token的官網(wǎng)上可以看到。

3.1.3持久化

Sa-Token 默認將數(shù)據(jù)保存在內(nèi)存中,此模式讀寫速度最快,且避免了序列化與反序列化帶來的性能消耗,但是此模式也有一些缺點,比如:

  1. 重啟后數(shù)據(jù)會丟失。
  2. 無法在分布式環(huán)境中共享數(shù)據(jù)。

所以,sa-token為我們提供了持久化的方法,我們可以在登錄成功之后將token數(shù)據(jù)存儲到redis中。然后,每次請求時到redis中取到我們的token數(shù)據(jù)。這樣就實現(xiàn)了即使重啟服務(wù),我們之前的登錄token也不會丟失

<!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-redis-jackson</artifactId>
    <version>1.37.0</version>
</dependency>

sa-token已經(jīng)幫我們整合了redis,我們自需要引入相應的pom依賴。其他的上層Api都不變。

3.2權(quán)限校驗:

我們已經(jīng)了解了常用的登錄認證方法,接下來,我們來看一下權(quán)限校驗;

1、獲取當前用戶的權(quán)限碼集合:

因為每個項目的需求不同,其權(quán)限設(shè)計也千變?nèi)f化,因此 [ 獲取當前賬號權(quán)限碼集合 ] 這一操作不可能內(nèi)置到框架中, 所以 Sa-Token 將此操作以接口的方式暴露給你,以方便你根據(jù)自己的業(yè)務(wù)邏輯進行重寫。

你需要做的就是新建一個類,實現(xiàn) StpInterface接口

/**
 * 自定義權(quán)限加載接口實現(xiàn)類
 */
@Component    // 保證此類被 SpringBoot 掃描,完成 Sa-Token 的自定義權(quán)限驗證擴展
public class StpInterfaceImpl implements StpInterface {
    /**
     * 返回一個賬號所擁有的權(quán)限碼集合 
     */
//    角色權(quán)限表
    @Autowired
    IRolePermissionsService rolePermissionsService;
//    用戶角色表
    @Autowired
    IUserRolesService userRolesService;
//權(quán)限表
    @Autowired
    IPermissionsService permissionsService;
//    角色表
    @Autowired
    IRolesService rolesService;
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
//        根據(jù)用戶id從用戶角色表中獲取角色id
        List<UserRoles> roleIds = userRolesService.list(new LambdaQueryWrapper<UserRoles>()
                .eq(UserRoles::getUserId,Integer.parseInt(loginId.toString())));
        List<Integer> rolesList = roleIds.stream().map(UserRoles::getRoleId).toList();
if (!(rolesList.size() >0)){
//    沒有任何權(quán)限
    return null;
}
        List<String> list = new ArrayList<>();
        rolesList.forEach(roleId ->{
            // 根據(jù)角色id從角色權(quán)限表中獲取權(quán)限id   
            List<RolePermissions> rolePermissions = rolePermissionsService.list(new LambdaQueryWrapper<RolePermissions>().
                    eq(RolePermissions::getRoleId, roleId));
            // 根據(jù)權(quán)限id從權(quán)限表中獲取權(quán)限名稱
            rolePermissions.forEach(permissionsId->{
                Permissions permissions = permissionsService.getById(permissionsId.getPermissionId());
                list.add(permissions.getName());
            });
        });
        // 返回用戶所有權(quán)限,
        return list;
    }
    /**
     * 返回一個賬號所擁有的角色標識集合 (權(quán)限與角色可分開校驗)
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        // 本 list 僅做模擬,實際項目中要根據(jù)具體業(yè)務(wù)邏輯來查詢角色
        //        根據(jù)用戶id從用戶角色表中獲取角色id
        List<UserRoles> roleIds = userRolesService.list(new LambdaQueryWrapper<UserRoles>()
                .eq(UserRoles::getUserId,Integer.parseInt(loginId.toString())));
        List<String> list = new ArrayList<>();
        if (!(roleIds.size() >0)){
//            用戶沒有分配角色
            return null;
        }
        roleIds.forEach(roleId ->{
            Roles byId = rolesService.getById(roleId.getRoleId());
            list.add(byId.getName());
        });
//        返回用戶所有角色標識集合
        return list;
    }
}

我所實現(xiàn)的是標準的RBAC(基于用戶、角色、權(quán)限的訪問控制模型)。所以,在得到用戶id的情況下、先根據(jù)用戶角色表查出角色id、在根據(jù)角色權(quán)限表查詢權(quán)限id,在根據(jù)權(quán)限表查出具體權(quán)限名稱。

上面使用了Mybatis-plus的條件構(gòu)造器和stream流的形式進行查詢。

參數(shù)解釋:

  • loginId:賬號id,即你在調(diào)用 StpUtil.login(id) 時寫入的標識值。
  • loginType:賬號體系標識,此處可以暫時忽略,在 [ 多賬戶認證 ] 章節(jié)下會對這個概念做詳細的解釋。

有同學會產(chǎn)生疑問:我實現(xiàn)了此接口,但是程序啟動時好像并沒有執(zhí)行,是不是我寫錯了? 答:不執(zhí)行是正常現(xiàn)象,程序啟動時不會執(zhí)行這個接口的方法,在每次調(diào)用鑒權(quán)代碼時,才會執(zhí)行到此。

權(quán)限校驗:
然后就可以用以下 api 來鑒權(quán)了:

// 獲?。寒斍百~號所擁有的權(quán)限集合
StpUtil.getPermissionList();
// 判斷:當前賬號是否含有指定權(quán)限, 返回 true 或 false
StpUtil.hasPermission("user.add");        
// 校驗:當前賬號是否含有指定權(quán)限, 如果驗證未通過,則拋出異常: NotPermissionException 
StpUtil.checkPermission("user.add");        
// 校驗:當前賬號是否含有指定權(quán)限 [指定多個,必須全部驗證通過]
StpUtil.checkPermissionAnd("user.add", "user.delete", "user.get");        
// 校驗:當前賬號是否含有指定權(quán)限 [指定多個,只要其一驗證通過即可]
StpUtil.checkPermissionOr("user.add", "user.delete", "user.get");    

擴展:NotPermissionException 對象可通過 getLoginType() 方法獲取具體是哪個 StpLogic 拋出的異常

角色校驗:
在 Sa-Token 中,角色和權(quán)限可以分開獨立驗證

// 獲?。寒斍百~號所擁有的角色集合
StpUtil.getRoleList();
// 判斷:當前賬號是否擁有指定角色, 返回 true 或 false
StpUtil.hasRole("super-admin");        
// 校驗:當前賬號是否含有指定角色標識, 如果驗證未通過,則拋出異常: NotRoleException
StpUtil.checkRole("super-admin");        
// 校驗:當前賬號是否含有指定角色標識 [指定多個,必須全部驗證通過]
StpUtil.checkRoleAnd("super-admin", "shop-admin");        
// 校驗:當前賬號是否含有指定角色標識 [指定多個,只要其一驗證通過即可] 
StpUtil.checkRoleOr("super-admin", "shop-admin");        

擴展:NotRoleException 對象可通過 getLoginType() 方法獲取具體是哪個 StpLogic 拋出的異常

權(quán)限通配符:
Sa-Token允許你根據(jù)通配符指定泛權(quán)限,例如當一個賬號擁有art.*的權(quán)限時,art.addart.delete、art.update都將匹配通過

// 當擁有 art.* 權(quán)限時
StpUtil.hasPermission("art.add");        // true
StpUtil.hasPermission("art.update");     // true
StpUtil.hasPermission("goods.add");      // false
// 當擁有 *.delete 權(quán)限時
StpUtil.hasPermission("art.delete");      // true
StpUtil.hasPermission("user.delete");     // true
StpUtil.hasPermission("user.update");     // false
// 當擁有 *.js 權(quán)限時
StpUtil.hasPermission("index.js");        // true
StpUtil.hasPermission("index.css");       // false
StpUtil.hasPermission("index.html");      // false

上帝權(quán)限:當一個賬號擁有 "*" 權(quán)限時,他可以驗證通過任何權(quán)限碼 (角色認證同理)

在我們的項目的TestController中進行測試:

  @GetMapping("/hello")
    public String hello() {
        System.out.println("驗證權(quán)限,是否具有‘所有權(quán)限'===============>"+StpUtil.hasPermission("所有權(quán)限"));
        System.out.println("驗證角色,是否具有‘管理員'角色===============>"+StpUtil.hasRole("管理員"));  
        System.out.println("說hello啊");
        return "test接口的hello";
    }

我們測試的最終結(jié)果:

可以看到確實輸出了兩個true。并且,只有在每次調(diào)用鑒權(quán)代碼時,才會執(zhí)行到我們自定義的權(quán)限方法中。

總結(jié):

我本來是想寫一篇介紹spring boot項目中整合Sa-Token來實現(xiàn)最常用的登錄校驗和權(quán)限認證的,但是寫著寫著就變成官網(wǎng)的復制機了。我在本篇文章中大量復制了官網(wǎng)上的內(nèi)容,原本只是想復制一些官方介紹就行了。但是這也從側(cè)面說明了Sa-Token官網(wǎng)制作的確實是比較好的,基本上不需要額外的學習,只要你有做過登錄和權(quán)限方面的項目經(jīng)驗,再看一遍官網(wǎng)的介紹就能直接上手了。

我之前寫過一個B2C模式的購物商臺,分為用戶端和管理端。管理端的登錄和權(quán)限校驗是用spring security寫的?,F(xiàn)在又了解了Sa-Token之后,真的還是認為Sa-Token的使用是比較簡單的。(也可能是我的項目還是比較簡單的,并沒有多少權(quán)限要實現(xiàn))并且這也是我們國人寫的開源框架,在一些方法的封裝、Api的設(shè)計上還是能直接理解的。在這里也算是為Sa-Token這個框架打個廣告吧,希望大家還是能夠多多支持國產(chǎn),國內(nèi)的開源之路也是充滿了坎坷與艱辛。

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

相關(guān)文章

  • SpringBoot實現(xiàn)發(fā)送電子郵件

    SpringBoot實現(xiàn)發(fā)送電子郵件

    這篇文章主要介紹了SpringBoot實現(xiàn)發(fā)送電子郵件,電子郵件是—種用電子手段提供信息交換的通信方式,是互聯(lián)網(wǎng)應用最廣的服務(wù)。通過網(wǎng)絡(luò)的電子郵件系統(tǒng),用戶可以非常快速的方式,與世界上任何一個角落的網(wǎng)絡(luò)用戶聯(lián)系,下面就來看看SpringBoot如何實現(xiàn)發(fā)送電子郵件吧
    2022-01-01
  • Mybatis單個參數(shù)的if判斷報異常There is no getter for property named ''xxx'' in ''class java.lang.Integer''的解決方案

    Mybatis單個參數(shù)的if判斷報異常There is no getter for property named ''x

    今天小編就為大家分享一篇關(guān)于Mybatis單個參數(shù)的if判斷報異常There is no getter for property named 'xxx' in 'class java.lang.Integer'的解決方案,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • IDEA集成git和使用步驟的實現(xiàn)方法

    IDEA集成git和使用步驟的實現(xiàn)方法

    這篇文章主要介紹了IDEA集成git和使用步驟的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • springboot 跨域配置類及跨域請求配置

    springboot 跨域配置類及跨域請求配置

    這篇文章主要介紹了springboot 跨域配置類及跨域請求配置,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • Java集合框架源碼分析之LinkedHashMap詳解

    Java集合框架源碼分析之LinkedHashMap詳解

    這篇文章主要介紹了Java集合框架源碼分析之LinkedHashMap詳解,內(nèi)容包括了linkedhashmap的簡介和源碼剖析以及關(guān)于LinkedHashMap的源碼總結(jié),內(nèi)容豐富,需要的朋友可以參考下。
    2017-09-09
  • JAVA基于Arrays.sort()實現(xiàn)數(shù)組升序和降序

    JAVA基于Arrays.sort()實現(xiàn)數(shù)組升序和降序

    這篇文章主要介紹了JAVA基于Arrays.sort()實現(xiàn)數(shù)組升序和降序,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Java深入淺出數(shù)組的定義與使用上篇

    Java深入淺出數(shù)組的定義與使用上篇

    數(shù)組是有序的元素序列,若將有限個類型相同的變量的集合命名,那么這個名稱為數(shù)組名。組成數(shù)組的各個變量稱為數(shù)組的分量,也稱為數(shù)組的元素,有時也稱為下標變量。數(shù)組是在程序設(shè)計中,為了處理方便, 把具有相同類型的若干元素按有序的形式組織起來的一種形式
    2022-03-03
  • java 中 poi解析Excel文件版本問題解決辦法

    java 中 poi解析Excel文件版本問題解決辦法

    這篇文章主要介紹了java 中 poi解析Excel文件版本問題解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • 解決IDEA使用springBoot創(chuàng)建項目,lombok標注實體類后編譯無報錯,但是運行時報錯問題

    解決IDEA使用springBoot創(chuàng)建項目,lombok標注實體類后編譯無報錯,但是運行時報錯問題

    文章詳細描述了在使用lombok的@Data注解標注實體類時遇到編譯無誤但運行時報錯的問題,分析了可能的原因,并提供了解決步驟
    2025-01-01
  • 剖析Java中阻塞隊列的實現(xiàn)原理及應用場景

    剖析Java中阻塞隊列的實現(xiàn)原理及應用場景

    這篇文章主要介紹了剖析Java中阻塞隊列的實現(xiàn)原理及應用場景,這里也對阻塞和非阻塞隊列的不同之處進行了對比,需要的朋友可以參考下
    2015-12-12

最新評論

邯郸市| 长宁区| 乐山市| 浦江县| 奉贤区| 沂源县| 泰宁县| 神池县| 武强县| 瑞安市| 金门县| 黎城县| 井研县| 惠来县| 平顺县| 新沂市| 太谷县| 兴城市| 勃利县| 五台县| 温州市| 定陶县| 谢通门县| 昌图县| 莱阳市| 广平县| 阿拉尔市| 古田县| 通榆县| 吉安县| 正蓝旗| 黎川县| 南投县| 阿瓦提县| 屏山县| 新邵县| 巫山县| 凌源市| 班玛县| 桐柏县| 海口市|