古詩詞大全網 - 古詩大全 - java如何做權限管理

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