SpringBoot實現(xiàn)RBAC權(quán)限校驗?zāi)P偷氖纠?/h1>
                          更新時間:2025年04月10日 09:38:46   作者:陌路物是人非   
                        
                        本文主要介紹了SpringBoot實現(xiàn)RBAC權(quán)限校驗?zāi)P偷氖纠?文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
                        
                        
                            最近想做一個管理系統(tǒng),記錄下自己的消費記錄,實現(xiàn)個文件上傳之類的功能,正好最近看了下RBAC模型,想學(xué)習(xí)一下,在這分享下實現(xiàn)過程,方便以后查看
RBAC模型簡單來說就是創(chuàng)建5張表(用戶表,角色表,權(quán)限表,角色與用戶表,角色與權(quán)限表)
通過給用戶分配不同角色,以及給角色分配不同權(quán)限,實現(xiàn)用戶的權(quán)限控制
不過這次我做的項目是個后臺管理系統(tǒng),主要是自己和朋友使用,所以角色其實就分成了管理員和普通用戶,因此我省略掉了角色和角色權(quán)限表,這樣雖然不夠靈活,但畢竟使用的人少,所以管理起來也非常方便
數(shù)據(jù)庫表
數(shù)據(jù)庫主要創(chuàng)建三張表
用戶表:
主要用來使用用戶登錄
- id 用戶主鍵
 - account 登錄賬號
 - password 登錄密碼
 - type 區(qū)分普通角色和管理員身份
 - username 用戶名
 - status 用戶的狀態(tài) 
 
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| id        | int         | NO   | PRI | NULL    | auto_increment |
| account   | char(15)    | YES  |     | NULL    |                |
| password  | varchar(50) | YES  |     | NULL    |                |
| type      | int         | YES  |     | NULL    |                |
| username  | varchar(20) | YES  |     | NULL    |                |
| status    | int         | YES  |     | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+
權(quán)限表:
主要用來記錄權(quán)限信息
- id 權(quán)限主鍵
 - name 權(quán)限名稱
 - parent_id 父權(quán)限的id 如果沒有父權(quán)限則為null
 - status 權(quán)限是否啟用
 - remark 權(quán)限備注
 - level 權(quán)限的層級,主要用來排序的字段
 
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int         | NO   | PRI | NULL    | auto_increment |
| name        | varchar(20) | YES  |     | NULL    |                |
| parent_id   | int         | YES  |     | NULL    |                |
| status      | int         | YES  |     | NULL    |                |
| remark      | varchar(50) | YES  |     | NULL    |                |
| create_user | int         | YES  |     | NULL    |                |
| create_date | date        | YES  |     | NULL    |                |
| update_user | int         | YES  |     | NULL    |                |
| update_date | date        | YES  |     | NULL    |                |
| level       | int         | YES  |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+
用戶權(quán)限表:
實現(xiàn)多對多關(guān)系的表
- id 主鍵
 - user_id 用戶的ID
 - permission_id 權(quán)限的ID
 
+---------------+------+------+-----+---------+----------------+
| Field         | Type | Null | Key | Default | Extra          |
+---------------+------+------+-----+---------+----------------+
| id            | int  | NO   | PRI | NULL    | auto_increment |
| user_id       | int  | YES  | MUL | NULL    |                |
| permission_id | int  | YES  |     | NULL    |                |
+---------------+------+------+-----+---------+----------------+
主要解釋下權(quán)限表,因為管理系統(tǒng)需要根據(jù)權(quán)限判斷是否提供菜單,因此我將菜單作為了一級權(quán)限(parent_id=null),一級權(quán)限下的增刪改查等操作定義為二級權(quán)限(parent_id=對應(yīng)的一級權(quán)限)
如果用戶擁有某些權(quán)限就在用戶權(quán)限表中創(chuàng)建一條記錄
后端實現(xiàn)
后端實現(xiàn)起來非常的方便,我使用的方法是定義一個注解通過AOP掃描這個注解,然后判斷當(dāng)前用戶是否擁有對應(yīng)的權(quán)限,如果沒有直接拋出異常,通過全局異常處理器進行捕捉
定義注解類:
因為后臺管理實現(xiàn)的非常簡單,幾乎不存在多個表之間相互嵌套,因此我用了個value表示當(dāng)前Controller需要使用到的權(quán)限的ID
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PermissionCheckAnnotation {
    int value();
}
定義枚舉類:
主要用來定義對應(yīng)權(quán)限的ID值
public class PermissionEnum {
    public final static int USER_QUERY = 14;
    public final static int USER_UPDATE = 15;
    public final static int USER_CREATE = 16;
}
定義AOP切面
    @Pointcut("execution(掃描當(dāng)前包中的全部文件) && @annotation(annotation.PermissionCheckAnnotation)")
    public void pt(){}
    @Around("pt()")
    public Object PermissionCheck(ProceedingJoinPoint jp) throws Throwable {
        MethodSignature signature = (MethodSignature) jp.getSignature();
// 反射拿到權(quán)限ID
        PermissionCheckAnnotation annotation = signature.getMethod().getAnnotation(PermissionCheckAnnotation.class);
        int value = annotation.value();
        // 獲取用戶ID
        Integer userId = UserContext.getUserId();
        // 查詢當(dāng)前用戶和權(quán)限ID之間是否存在關(guān)聯(lián)關(guān)系,如果不存在拋出異常
        Integer hasPermission = userPermissionMapper.hasPermission(value, userId);
        if (hasPermission == null || hasPermission == 0){
            throw new PermissionException("權(quán)限不足,請聯(lián)系管理員");
        }
        return jp.proceed();
    }
定義controller
    @PermissionCheckAnnotation(PermissionEnum.USER_CREATE)
    @PostMapping("/createUser")
    public Result<String> createUser() {
    }
后端修改權(quán)限
前端將修改完的權(quán)限發(fā)送過來,大體格式就是一個整數(shù)數(shù)組([1,2,3,4,5]),表示當(dāng)前用戶的全部權(quán)限的ID集合
 權(quán)限更新的主要思路就是將該用戶的全部權(quán)限刪除,再重建
如果嫌棄太慢的話,我覺得可以取交集之類的操作,提升效率,或者再額外定義一個字段,用來判斷當(dāng)前用戶權(quán)限的狀態(tài)(delete字段)這樣應(yīng)該會比delete insert效率高一些
不過俺是個菜鳥小白+懶狗,怎么簡單怎么來了
刪除用戶不擁有的權(quán)限
    <delete id="deletePermission">
        delete from user_permission where user_id = #{userId}
        and permission_id not in
        <foreach item="item" collection="permissionList" open="(" close=")" separator=",">
            #{item}
        </foreach>
    </delete>
插入新權(quán)限
因為是全部插入,權(quán)限可能會產(chǎn)生重復(fù),因此我給user_id和permission_id添加唯一約束,并在插入時忽略錯誤
    <insert id="createPermission">
        insert ignore into user_permission
        <foreach collection="permissionList" open="values" item="item" separator=",">
            (null,#{userId},#{item})
        </foreach>
    </insert>
前端
我前端不是很好,只會單純畫個界面,因此我還沒有實現(xiàn)按鈕級別的權(quán)限控制,不過大體思路是自定義指令,然后檢查是否擁有對應(yīng)的權(quán)限,如果沒有權(quán)限直接隱藏該按鈕
至于菜單級別的權(quán)限,我的做法是每次都發(fā)送一個請求,判斷能用多少菜單,即使被人扒出來其他界面,后端也做了權(quán)限的校驗,數(shù)據(jù)還是拿不到
這里主要記錄下如何在前端修改權(quán)限
查詢返回的數(shù)據(jù)格式大致如下
{
    id: 15
    level: 2
    name: "操作查詢"
    parentId: 1
    remark: "操作菜單下的查詢功能"
    status: 1
}
{
    id: 1
    level: 1
    name: "操作菜單"
    parentId: null
    remark: "操作菜單"
    status: 1
}
我想要在element-Plus中的樹形控件中實現(xiàn)展示,操作功能,大致需要將上面的數(shù)據(jù)變成這樣的格式
const data: Tree[] = [
  {
    label: 'Level one 1',
    children: [
      {
        label: 'Level two 1-1',
      },
    ],
  },
]
這里通過dfs實現(xiàn)的(同層權(quán)限之間不會產(chǎn)生交集,所以應(yīng)該能用最小生成樹完成,不過俺是個懶狗,寫了個最簡單的方式)
const st = new Map();
for (let i = 0; i < res.length; i++) {
    st.set(res[i].id, 0);
}
const list = [];
for (let i = 0; i < res.length; i++) {
    if (res[i].parentId == null) {
        const children = dfs(i, res);
        list.push(children);
     }
}
tree.value = list;
function dfs(idx, res) {
    st.set(res[idx].id, 1);
    const children = []
    for (let i = 0; i < res.length; i++) {
        if (st.get(res[i].id) == 1) {
            continue;
        }
        if (res[i].parentId == res[idx].id) {
            children.push(dfs(i, res))
        }
    }
    if (children.length == 0)
        return { id: res[idx].id, label: res[idx].name }
    return { id: res[idx].id, label: res[idx].name, children }
}
然后把操作完的數(shù)據(jù)扔到elTree中
<el-tree v-loading="treeLoading"
@check="checkChange" 
style="max-width: 200px" 
ref="elTreeRef"
:data="tree"
:props="defaultProps" 
show-checkbox 
node-key="id" />
然后就是用戶的初始權(quán)限,通過點擊不同的用戶向后端查詢該用戶擁有的權(quán)限,el-tree有個屬性可以設(shè)置默認(rèn)勾選的復(fù)選框,但我不知道為什么點擊不同用戶時,樹中上一個勾選的復(fù)選框不會被取消,因此使用了el-tree的方法,當(dāng)點擊不同用戶時觸發(fā),傳入的數(shù)據(jù)是一個整數(shù)數(shù)組([1,2,3]),表示勾選的節(jié)點的id,需要在el-tree標(biāo)簽中提前指定node-key
elTreeRef.value.setCheckedKeys(hasPermission.value)
最后就是權(quán)限修改,大致就是用戶點擊不同的復(fù)選框,選擇或取消不同的權(quán)限,通過綁定@check事件,然后獲取里面的數(shù)據(jù),這里說一下當(dāng)點擊子復(fù)選框時,父復(fù)選框也會觸發(fā)一次,當(dāng)父選框下的全部子復(fù)選框都取消時,父復(fù)選框也會取消,通過下面這個方法能拿到當(dāng)前勾選的復(fù)選框,然后發(fā)送數(shù)據(jù)
    const checkChange = function (data1, data2) {
        currentPermission = [...data2.checkedKeys, ...data2.halfCheckedKeys]
    }
總結(jié)
就這樣,實現(xiàn)了一個簡單的權(quán)限校驗?zāi)P?,雖然缺少了角色表,但大體功能上大差不差,添加上角色表后,可能還得考慮權(quán)限的遷移,權(quán)限的分配等等問題
不過對于一個簡單的系統(tǒng)來說還是十分夠用力
還有為什么csdn還對封面圖大小設(shè)置了,把我的卡茲米都壓成什么樣了??????
到此這篇關(guān)于SpringBoot實現(xiàn)RBAC權(quán)限校驗?zāi)P偷氖纠奈恼戮徒榻B到這了,更多相關(guān)SpringBoot RBAC權(quán)限校驗 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
                            
                            
                        
                        
                        
                            
                        
                        
                            
                            
                        
                        
                            
                        
                        
                        
                            相關(guān)文章
                             
 
 
-  
 springboot實現(xiàn)獲取客戶端IP地址的示例代碼
本文介紹了在SpringBoot中獲取客戶端IP地址的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧 2024-11-11  
-  
 SpringBoot在IDEA中實現(xiàn)熱部署的步驟
這篇文章主要介紹了SpringBoot在IDEA中實現(xiàn)熱部署的步驟,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下 2020-11-11  
-  
 mybatis中如何實現(xiàn)一個標(biāo)簽執(zhí)行多個sql語句
這篇文章主要介紹了mybatis中如何實現(xiàn)一個標(biāo)簽執(zhí)行多個sql語句問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教 2024-04-04  
-  
 Java調(diào)用Pytorch實現(xiàn)以圖搜圖功能
這篇文章主要為大家詳細(xì)介紹了Java如何調(diào)用Pytorch實現(xiàn)以圖搜圖功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下 2023-06-06  
 
-  
 Java switch case數(shù)據(jù)類型原理解析
這篇文章主要介紹了Java switch case數(shù)據(jù)類型原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下 2020-01-01  
 
                        
                        
                            
                        
                        
                        
                            最新評論
                            
                                
                            
                        
                    
最近想做一個管理系統(tǒng),記錄下自己的消費記錄,實現(xiàn)個文件上傳之類的功能,正好最近看了下RBAC模型,想學(xué)習(xí)一下,在這分享下實現(xiàn)過程,方便以后查看
RBAC模型簡單來說就是創(chuàng)建5張表(用戶表,角色表,權(quán)限表,角色與用戶表,角色與權(quán)限表)
通過給用戶分配不同角色,以及給角色分配不同權(quán)限,實現(xiàn)用戶的權(quán)限控制
不過這次我做的項目是個后臺管理系統(tǒng),主要是自己和朋友使用,所以角色其實就分成了管理員和普通用戶,因此我省略掉了角色和角色權(quán)限表,這樣雖然不夠靈活,但畢竟使用的人少,所以管理起來也非常方便
數(shù)據(jù)庫表
數(shù)據(jù)庫主要創(chuàng)建三張表
用戶表:
主要用來使用用戶登錄
- id 用戶主鍵
 - account 登錄賬號
 - password 登錄密碼
 - type 區(qū)分普通角色和管理員身份
 - username 用戶名
 - status 用戶的狀態(tài)
 
+-----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | account | char(15) | YES | | NULL | | | password | varchar(50) | YES | | NULL | | | type | int | YES | | NULL | | | username | varchar(20) | YES | | NULL | | | status | int | YES | | NULL | | +-----------+-------------+------+-----+---------+----------------+
權(quán)限表:
主要用來記錄權(quán)限信息
- id 權(quán)限主鍵
 - name 權(quán)限名稱
 - parent_id 父權(quán)限的id 如果沒有父權(quán)限則為null
 - status 權(quán)限是否啟用
 - remark 權(quán)限備注
 - level 權(quán)限的層級,主要用來排序的字段
 
+-------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+-------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | parent_id | int | YES | | NULL | | | status | int | YES | | NULL | | | remark | varchar(50) | YES | | NULL | | | create_user | int | YES | | NULL | | | create_date | date | YES | | NULL | | | update_user | int | YES | | NULL | | | update_date | date | YES | | NULL | | | level | int | YES | | NULL | | +-------------+-------------+------+-----+---------+----------------+
用戶權(quán)限表:
實現(xiàn)多對多關(guān)系的表
- id 主鍵
 - user_id 用戶的ID
 - permission_id 權(quán)限的ID
 
+---------------+------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | user_id | int | YES | MUL | NULL | | | permission_id | int | YES | | NULL | | +---------------+------+------+-----+---------+----------------+
主要解釋下權(quán)限表,因為管理系統(tǒng)需要根據(jù)權(quán)限判斷是否提供菜單,因此我將菜單作為了一級權(quán)限(parent_id=null),一級權(quán)限下的增刪改查等操作定義為二級權(quán)限(parent_id=對應(yīng)的一級權(quán)限)
如果用戶擁有某些權(quán)限就在用戶權(quán)限表中創(chuàng)建一條記錄
后端實現(xiàn)
后端實現(xiàn)起來非常的方便,我使用的方法是定義一個注解通過AOP掃描這個注解,然后判斷當(dāng)前用戶是否擁有對應(yīng)的權(quán)限,如果沒有直接拋出異常,通過全局異常處理器進行捕捉
定義注解類:
因為后臺管理實現(xiàn)的非常簡單,幾乎不存在多個表之間相互嵌套,因此我用了個value表示當(dāng)前Controller需要使用到的權(quán)限的ID
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PermissionCheckAnnotation {
    int value();
}
定義枚舉類:
主要用來定義對應(yīng)權(quán)限的ID值
public class PermissionEnum {
    public final static int USER_QUERY = 14;
    public final static int USER_UPDATE = 15;
    public final static int USER_CREATE = 16;
}定義AOP切面
    @Pointcut("execution(掃描當(dāng)前包中的全部文件) && @annotation(annotation.PermissionCheckAnnotation)")
    public void pt(){}
    @Around("pt()")
    public Object PermissionCheck(ProceedingJoinPoint jp) throws Throwable {
        MethodSignature signature = (MethodSignature) jp.getSignature();
// 反射拿到權(quán)限ID
        PermissionCheckAnnotation annotation = signature.getMethod().getAnnotation(PermissionCheckAnnotation.class);
        int value = annotation.value();
        // 獲取用戶ID
        Integer userId = UserContext.getUserId();
        // 查詢當(dāng)前用戶和權(quán)限ID之間是否存在關(guān)聯(lián)關(guān)系,如果不存在拋出異常
        Integer hasPermission = userPermissionMapper.hasPermission(value, userId);
        if (hasPermission == null || hasPermission == 0){
            throw new PermissionException("權(quán)限不足,請聯(lián)系管理員");
        }
        return jp.proceed();
    }定義controller
    @PermissionCheckAnnotation(PermissionEnum.USER_CREATE)
    @PostMapping("/createUser")
    public Result<String> createUser() {
    }后端修改權(quán)限
前端將修改完的權(quán)限發(fā)送過來,大體格式就是一個整數(shù)數(shù)組([1,2,3,4,5]),表示當(dāng)前用戶的全部權(quán)限的ID集合
權(quán)限更新的主要思路就是將該用戶的全部權(quán)限刪除,再重建
如果嫌棄太慢的話,我覺得可以取交集之類的操作,提升效率,或者再額外定義一個字段,用來判斷當(dāng)前用戶權(quán)限的狀態(tài)(delete字段)這樣應(yīng)該會比delete insert效率高一些
不過俺是個菜鳥小白+懶狗,怎么簡單怎么來了
刪除用戶不擁有的權(quán)限
    <delete id="deletePermission">
        delete from user_permission where user_id = #{userId}
        and permission_id not in
        <foreach item="item" collection="permissionList" open="(" close=")" separator=",">
            #{item}
        </foreach>
    </delete>插入新權(quán)限
因為是全部插入,權(quán)限可能會產(chǎn)生重復(fù),因此我給user_id和permission_id添加唯一約束,并在插入時忽略錯誤
    <insert id="createPermission">
        insert ignore into user_permission
        <foreach collection="permissionList" open="values" item="item" separator=",">
            (null,#{userId},#{item})
        </foreach>
    </insert>前端
我前端不是很好,只會單純畫個界面,因此我還沒有實現(xiàn)按鈕級別的權(quán)限控制,不過大體思路是自定義指令,然后檢查是否擁有對應(yīng)的權(quán)限,如果沒有權(quán)限直接隱藏該按鈕
至于菜單級別的權(quán)限,我的做法是每次都發(fā)送一個請求,判斷能用多少菜單,即使被人扒出來其他界面,后端也做了權(quán)限的校驗,數(shù)據(jù)還是拿不到
這里主要記錄下如何在前端修改權(quán)限
查詢返回的數(shù)據(jù)格式大致如下
{
    id: 15
    level: 2
    name: "操作查詢"
    parentId: 1
    remark: "操作菜單下的查詢功能"
    status: 1
}
{
    id: 1
    level: 1
    name: "操作菜單"
    parentId: null
    remark: "操作菜單"
    status: 1
}我想要在element-Plus中的樹形控件中實現(xiàn)展示,操作功能,大致需要將上面的數(shù)據(jù)變成這樣的格式
const data: Tree[] = [
  {
    label: 'Level one 1',
    children: [
      {
        label: 'Level two 1-1',
      },
    ],
  },
]這里通過dfs實現(xiàn)的(同層權(quán)限之間不會產(chǎn)生交集,所以應(yīng)該能用最小生成樹完成,不過俺是個懶狗,寫了個最簡單的方式)
const st = new Map();
for (let i = 0; i < res.length; i++) {
    st.set(res[i].id, 0);
}
const list = [];
for (let i = 0; i < res.length; i++) {
    if (res[i].parentId == null) {
        const children = dfs(i, res);
        list.push(children);
     }
}
tree.value = list;
function dfs(idx, res) {
    st.set(res[idx].id, 1);
    const children = []
    for (let i = 0; i < res.length; i++) {
        if (st.get(res[i].id) == 1) {
            continue;
        }
        if (res[i].parentId == res[idx].id) {
            children.push(dfs(i, res))
        }
    }
    if (children.length == 0)
        return { id: res[idx].id, label: res[idx].name }
    return { id: res[idx].id, label: res[idx].name, children }
}然后把操作完的數(shù)據(jù)扔到elTree中
<el-tree v-loading="treeLoading" @check="checkChange" style="max-width: 200px" ref="elTreeRef" :data="tree" :props="defaultProps" show-checkbox node-key="id" />
然后就是用戶的初始權(quán)限,通過點擊不同的用戶向后端查詢該用戶擁有的權(quán)限,el-tree有個屬性可以設(shè)置默認(rèn)勾選的復(fù)選框,但我不知道為什么點擊不同用戶時,樹中上一個勾選的復(fù)選框不會被取消,因此使用了el-tree的方法,當(dāng)點擊不同用戶時觸發(fā),傳入的數(shù)據(jù)是一個整數(shù)數(shù)組([1,2,3]),表示勾選的節(jié)點的id,需要在el-tree標(biāo)簽中提前指定node-key
elTreeRef.value.setCheckedKeys(hasPermission.value)
最后就是權(quán)限修改,大致就是用戶點擊不同的復(fù)選框,選擇或取消不同的權(quán)限,通過綁定@check事件,然后獲取里面的數(shù)據(jù),這里說一下當(dāng)點擊子復(fù)選框時,父復(fù)選框也會觸發(fā)一次,當(dāng)父選框下的全部子復(fù)選框都取消時,父復(fù)選框也會取消,通過下面這個方法能拿到當(dāng)前勾選的復(fù)選框,然后發(fā)送數(shù)據(jù)
    const checkChange = function (data1, data2) {
        currentPermission = [...data2.checkedKeys, ...data2.halfCheckedKeys]
    }總結(jié)
就這樣,實現(xiàn)了一個簡單的權(quán)限校驗?zāi)P?,雖然缺少了角色表,但大體功能上大差不差,添加上角色表后,可能還得考慮權(quán)限的遷移,權(quán)限的分配等等問題
不過對于一個簡單的系統(tǒng)來說還是十分夠用力
還有為什么csdn還對封面圖大小設(shè)置了,把我的卡茲米都壓成什么樣了??????
到此這篇關(guān)于SpringBoot實現(xiàn)RBAC權(quán)限校驗?zāi)P偷氖纠奈恼戮徒榻B到這了,更多相關(guān)SpringBoot RBAC權(quán)限校驗 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
 springboot實現(xiàn)獲取客戶端IP地址的示例代碼
本文介紹了在SpringBoot中獲取客戶端IP地址的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
 SpringBoot在IDEA中實現(xiàn)熱部署的步驟
這篇文章主要介紹了SpringBoot在IDEA中實現(xiàn)熱部署的步驟,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-11-11
 mybatis中如何實現(xiàn)一個標(biāo)簽執(zhí)行多個sql語句
這篇文章主要介紹了mybatis中如何實現(xiàn)一個標(biāo)簽執(zhí)行多個sql語句問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
 Java調(diào)用Pytorch實現(xiàn)以圖搜圖功能
這篇文章主要為大家詳細(xì)介紹了Java如何調(diào)用Pytorch實現(xiàn)以圖搜圖功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下2023-06-06
 Java switch case數(shù)據(jù)類型原理解析
這篇文章主要介紹了Java switch case數(shù)據(jù)類型原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01

