Java 實現系統權限控制思路

首先介紹下思路:

1、用戶表 user;

2、角色表 role;

3、菜單 menu;

4、角色菜單權限表 role_menu;

5、用戶菜單權限表 user_menu;


如圖:


根據用戶角色取出該角色所有權限,並對用戶進行權限分配;注意菜單的按鈕(新增、刪除、修改)權限是放在中間表(user_menu)中的;


1、新增用戶時,是要根據用戶角色進行分配權限的 一定記得批量添加;批量、批量、批量,重要的事情說三遍,不要查詢角色權限,然後for循環,這樣效率太低了;

SQL如下:

INSERT INTO sys_user_menu(UserId, MenuId, DelPower,    UpdPower,    InsPower,    ViewPower)
SELECT #{userId} UserId, MenuId, 1 DelPower, 1 UpdPower, 1 InsPower, 1 ViewPower FROM sys_role_menu WHERE RoelId = #{roleId}

updPower 默認都是有的 所以都是1,這樣根據角色查詢出權限直接添加,響應時間大大提升;


2、修改用戶角色也要記得重新分配用戶權限哦!這個不能忘,可以用上面的方法;

業務方法:


如果角色沒有修改,是不用重新分配權限的,所有userRole 重置爲 null,如果角色修改則刪除原權限,重新進行分配;


3、最後要優化的就是根據用戶查詢權限的時候啦,我最開始是這樣做的,查詢角色權限,用戶權限,返回到前端,前端進行處理;結果就是很卡 基本上要三到四秒,

解決方案,一步到位;一個查詢返回全部數據。

如下SQL:

SELECT menu.MenuId id, ParentId pid, MenuName text,
            (SELECT COUNT(1) FROM sys_user_menu WHERE UserId = #{userId} AND  MenuId = sm.MenuId) isShow,
            (SELECT CONCAT(
                (CASE WHEN smenu.InsPower = 1 THEN 1 ELSE 0 END), ',',
                (CASE WHEN smenu.DelPower = 1 THEN 1 ELSE 0 END), ',',
                (CASE WHEN smenu.UpdPower = 1 THEN 1 ELSE 0 END), ',',
                (CASE WHEN smenu.ViewPower = 1 THEN 1 ELSE 0 END))
                FROM sys_user_menu smenu WHERE smenu.UserId = #{userId}
                AND  smenu.MenuId = sm.MenuId) MenuInfo
            FROM sys_role_menu sm INNER JOIN sys_menu menu on sm.MenuId = menu.MenuId
            WHERE RoelId = #{roleId}


首先根據 角色ID查詢出權限,然後子查詢用戶是否有該權限,有返回1 木用返回 0;

最後按鈕權限 我是直接拼接成字符串,分別對應 添加、刪除、修改、查看 1 有該按鈕 0 沒有該按鈕;


優化後 不管是添加、修改用戶,加載用戶權限都能控制在 1~2 秒;







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章