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

SpringBoot實現(xiàn)RBAC權限校驗模型的示例

 更新時間:2025年04月10日 09:38:46   作者:陌路物是人非  
本文主要介紹了SpringBoot實現(xiàn)RBAC權限校驗模型的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

最近想做一個管理系統(tǒng),記錄下自己的消費記錄,實現(xiàn)個文件上傳之類的功能,正好最近看了下RBAC模型,想學習一下,在這分享下實現(xiàn)過程,方便以后查看

RBAC模型簡單來說就是創(chuàng)建5張表(用戶表,角色表,權限表,角色與用戶表,角色與權限表)

通過給用戶分配不同角色,以及給角色分配不同權限,實現(xiàn)用戶的權限控制

不過這次我做的項目是個后臺管理系統(tǒng),主要是自己和朋友使用,所以角色其實就分成了管理員和普通用戶,因此我省略掉了角色和角色權限表,這樣雖然不夠靈活,但畢竟使用的人少,所以管理起來也非常方便

數(shù)據庫表

數(shù)據庫主要創(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    |                |
+-----------+-------------+------+-----+---------+----------------+

權限表:

主要用來記錄權限信息

  • id 權限主鍵
  • name 權限名稱
  • parent_id 父權限的id 如果沒有父權限則為null
  • status 權限是否啟用
  • remark 權限備注
  • level 權限的層級,主要用來排序的字段
+-------------+-------------+------+-----+---------+----------------+
| 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    |                |
+-------------+-------------+------+-----+---------+----------------+

用戶權限表:

實現(xiàn)多對多關系的表

  • id 主鍵
  • user_id 用戶的ID
  • permission_id 權限的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    |                |
+---------------+------+------+-----+---------+----------------+

主要解釋下權限表,因為管理系統(tǒng)需要根據權限判斷是否提供菜單,因此我將菜單作為了一級權限(parent_id=null),一級權限下的增刪改查等操作定義為二級權限(parent_id=對應的一級權限)

如果用戶擁有某些權限就在用戶權限表中創(chuàng)建一條記錄

后端實現(xiàn)

后端實現(xiàn)起來非常的方便,我使用的方法是定義一個注解通過AOP掃描這個注解,然后判斷當前用戶是否擁有對應的權限,如果沒有直接拋出異常,通過全局異常處理器進行捕捉

定義注解類:

因為后臺管理實現(xiàn)的非常簡單,幾乎不存在多個表之間相互嵌套,因此我用了個value表示當前Controller需要使用到的權限的ID

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PermissionCheckAnnotation {
    int value();
}

定義枚舉類:

主要用來定義對應權限的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(掃描當前包中的全部文件) && @annotation(annotation.PermissionCheckAnnotation)")
    public void pt(){}

    @Around("pt()")
    public Object PermissionCheck(ProceedingJoinPoint jp) throws Throwable {
        MethodSignature signature = (MethodSignature) jp.getSignature();
// 反射拿到權限ID
        PermissionCheckAnnotation annotation = signature.getMethod().getAnnotation(PermissionCheckAnnotation.class);
        int value = annotation.value();
        // 獲取用戶ID
        Integer userId = UserContext.getUserId();
        // 查詢當前用戶和權限ID之間是否存在關聯(lián)關系,如果不存在拋出異常
        Integer hasPermission = userPermissionMapper.hasPermission(value, userId);
        if (hasPermission == null || hasPermission == 0){
            throw new PermissionException("權限不足,請聯(lián)系管理員");
        }
        return jp.proceed();
    }

定義controller

    @PermissionCheckAnnotation(PermissionEnum.USER_CREATE)
    @PostMapping("/createUser")
    public Result<String> createUser() {
    }

后端修改權限

前端將修改完的權限發(fā)送過來,大體格式就是一個整數(shù)數(shù)組([1,2,3,4,5]),表示當前用戶的全部權限的ID集合

 權限更新的主要思路就是將該用戶的全部權限刪除,再重建

如果嫌棄太慢的話,我覺得可以取交集之類的操作,提升效率,或者再額外定義一個字段,用來判斷當前用戶權限的狀態(tài)(delete字段)這樣應該會比delete insert效率高一些

不過俺是個菜鳥小白+懶狗,怎么簡單怎么來了

刪除用戶不擁有的權限

    <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>

插入新權限

因為是全部插入,權限可能會產生重復,因此我給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)按鈕級別的權限控制,不過大體思路是自定義指令,然后檢查是否擁有對應的權限,如果沒有權限直接隱藏該按鈕

至于菜單級別的權限,我的做法是每次都發(fā)送一個請求,判斷能用多少菜單,即使被人扒出來其他界面,后端也做了權限的校驗,數(shù)據還是拿不到

這里主要記錄下如何在前端修改權限

查詢返回的數(shù)據格式大致如下

{
    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ù)據變成這樣的格式

const data: Tree[] = [
  {
    label: 'Level one 1',
    children: [
      {
        label: 'Level two 1-1',
      },
    ],
  },
]

這里通過dfs實現(xiàn)的(同層權限之間不會產生交集,所以應該能用最小生成樹完成,不過俺是個懶狗,寫了個最簡單的方式)

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ù)據扔到elTree中

<el-tree v-loading="treeLoading"
@check="checkChange" 
style="max-width: 200px" 
ref="elTreeRef"
:data="tree"
:props="defaultProps" 
show-checkbox 
node-key="id" />

然后就是用戶的初始權限,通過點擊不同的用戶向后端查詢該用戶擁有的權限,el-tree有個屬性可以設置默認勾選的復選框,但我不知道為什么點擊不同用戶時,樹中上一個勾選的復選框不會被取消,因此使用了el-tree的方法,當點擊不同用戶時觸發(fā),傳入的數(shù)據是一個整數(shù)數(shù)組([1,2,3]),表示勾選的節(jié)點的id,需要在el-tree標簽中提前指定node-key

elTreeRef.value.setCheckedKeys(hasPermission.value)

最后就是權限修改,大致就是用戶點擊不同的復選框,選擇或取消不同的權限,通過綁定@check事件,然后獲取里面的數(shù)據,這里說一下當點擊子復選框時,父復選框也會觸發(fā)一次,當父選框下的全部子復選框都取消時,父復選框也會取消,通過下面這個方法能拿到當前勾選的復選框,然后發(fā)送數(shù)據

    const checkChange = function (data1, data2) {
        currentPermission = [...data2.checkedKeys, ...data2.halfCheckedKeys]
    }

總結

就這樣,實現(xiàn)了一個簡單的權限校驗模型,雖然缺少了角色表,但大體功能上大差不差,添加上角色表后,可能還得考慮權限的遷移,權限的分配等等問題

不過對于一個簡單的系統(tǒng)來說還是十分夠用力

還有為什么csdn還對封面圖大小設置了,把我的卡茲米都壓成什么樣了??????

到此這篇關于SpringBoot實現(xiàn)RBAC權限校驗模型的示例的文章就介紹到這了,更多相關SpringBoot RBAC權限校驗 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java導出json格式文件的示例代碼

    java導出json格式文件的示例代碼

    本篇文章主要介紹了java導出json格式文件的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • java注解之運行時修改字段的注解值操作

    java注解之運行時修改字段的注解值操作

    這篇文章主要介紹了java注解之運行時修改字段的注解值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 關于String.format()格式化輸出方式

    關于String.format()格式化輸出方式

    String.format()是Java的格式化輸出方法,支持多種數(shù)據類型和格式化選項,它在格式化和拼接字符串時具有較高的靈活性,但效率相對較低,特別是在處理大量數(shù)據時,在實際編程中,應根據具體需求選擇合適的字符串拼接方式
    2024-12-12
  • Java操作Excel的示例詳解

    Java操作Excel的示例詳解

    在平時可以使用IO流對Excle進行操作,但是現(xiàn)在使用更加方便的第三方組件來實現(xiàn)。本文就來和大家聊聊Java如何通過第三方組件實現(xiàn)操作Excel,需要的可以參考一下
    2023-01-01
  • SpringBoot實現(xiàn)日志鏈路追蹤的項目實踐

    SpringBoot實現(xiàn)日志鏈路追蹤的項目實踐

    在分布式系統(tǒng)中,由于請求的處理過程可能會跨越多個服務,因此,對請求的追蹤變得尤為重要,本文主要介紹了SpringBoot實現(xiàn)日志鏈路追蹤的項目實踐,感興趣的可以了解一下
    2024-03-03
  • IntelliJ IDEA(或者JetBrains PyCharm)中彈出

    IntelliJ IDEA(或者JetBrains PyCharm)中彈出"IntelliJ IDEA License

    今天小編就為大家分享一篇關于IntelliJ IDEA(或者JetBrains PyCharm)中彈出"IntelliJ IDEA License Activation"的解決辦法,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • JVM?中的?returnAddress過程詳解

    JVM?中的?returnAddress過程詳解

    JVM的畢竟是個虛擬機,是一種規(guī)范,雖說符合馮諾依曼的計算機設計理念,但是他并不是實體計算機,所以他的組成也不是什么存儲器,控制器,運算 器,輸入輸出設備,本文給大家介紹JVM?中的?returnAddress,感興趣的朋友一起看看吧
    2022-04-04
  • Linux+Docker+SpringBoot+IDEA一鍵自動化部署的詳細步驟

    Linux+Docker+SpringBoot+IDEA一鍵自動化部署的詳細步驟

    這篇文章主要介紹了Linux+Docker+SpringBoot+IDEA一鍵自動化部署的詳細步驟,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • springboot配合Thymeleaf完美實現(xiàn)遍歷功能

    springboot配合Thymeleaf完美實現(xiàn)遍歷功能

    Thymeleaf顯然是一個開發(fā)頁面的技術,現(xiàn)在各種前端技術層出不窮,比如現(xiàn)在主流的Vue、React、AngularJS等。這篇文章主要介紹了springboot配合Thymeleaf完美實現(xiàn)遍歷,需要的朋友可以參考下
    2021-09-09
  • Spring Boot集成Java DSL的實現(xiàn)代碼

    Spring Boot集成Java DSL的實現(xiàn)代碼

    這篇文章主要介紹了Spring Boot集成Java DSL的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-01-01

最新評論

咸阳市| 塔城市| 庆安县| 高青县| 长垣县| 牟定县| 讷河市| 兴义市| 香河县| 苍溪县| 策勒县| 宁海县| 康马县| 萝北县| 新乡市| 龙州县| 甘洛县| 万州区| 台东市| 镇赉县| 柘荣县| 沐川县| 慈利县| 湖南省| 阳信县| 灌云县| 蚌埠市| 阜南县| 准格尔旗| 万宁市| 边坝县| 西贡区| 沧源| 公主岭市| 沂南县| 通化市| 章丘市| 原阳县| 台湾省| 深水埗区| 丹棱县|