一、需求
不同權限的用戶登錄後臺管理系統時,需要展示不同的菜單,不同的用戶有不同的權限嘛。那這個需求該如何實現呢?
二、設計思路
我們這樣來思考。
對於用戶權限控制的設計主要涉及3個實體:用戶、崗位和權限。
一個用戶對應一個崗位,一個崗位對應一些菜單模塊(權限)。
既然是這樣,那就不難設計了。
我們在數據庫中設計3個表:
- 用戶表(user)
- 崗位表(role)
- 模塊表(module)
然後,繼續增加兩個表:
- 用戶崗位表(user_role):用於保存用戶所處的崗位信息
- 崗位模塊表(role_module):用戶保存崗位對應的菜單模塊信息
作爲靈魂畫家,給大家畫個圖描述一下吧:
用戶表 ------------------- 崗位表 ------------------- 模塊表
| | | |
| ---- 用戶崗位表 ---- | | ---- 崗位模塊表 ---- |
做完表設計,權限設計的方案就基本出來了。
三、關鍵代碼
登錄成功後進入主頁時,加載用戶的頂部菜單和左側菜單
@RequestMapping("/index")
public ModelAndView index(HttpServletRequest request) {
String username = request.getSession().getAttribute("username").toString();
//根據用戶名獲取用戶菜單
List<UserRoleModule> menuList = userRoleModuleService.getMenuByUsername(username);
List<UserRoleModule> topMenuList = new ArrayList<UserRoleModule>();
List<UserRoleModule> sideMenuList = new ArrayList<UserRoleModule>();
//分別保存頂部菜單和左側菜單
for (UserRoleModule menu : menuList) {
if ("0".equals(menu.getM_parent().toString())) {
topMenuList.add(menu);
} else {
sideMenuList.add(menu);
}
}
ModelAndView model = new ModelAndView("index");
//獲取用戶姓名,用於展示在前端頁面上
if (menuList.size() > 0) {
model.addObject("user_cname", menuList.get(0).getCname());
} else {//用戶沒有菜單時,展示用戶名
model.addObject("user_cname", username);
}
model.addObject("topMenuList", JSON.toJSONString(topMenuList));
model.addObject("sideMenuList", JSON.toJSONString(sideMenuList));
logger.info("/index - username: " + username);
model.addObject("current_user", username);
return model;
}
前端頁面上具體如何展示頂部菜單和左側菜單,在前面的博文中已經介紹了哦,這裏就不贅述了。
Mybatis中的查詢語句:
<select id="getMenuByUsername" parameterType="java.lang.String" resultMap="BaseResultMap">
select
user_id, username, cname, role_id, role_name, m_id, m_name, m_parent, url, m_class
from user_role_module
where username = #{username,jdbcType=VARCHAR}
</select>
四、本篇小結
這篇博客給大家提供了一種控制用戶權限的方案,讓不同用戶登錄進系統後展示不同的菜單。不過這個方案並不完美,還有一些比較嚴重的問題需要解決,在後續教程中會給大家提到。更多交流歡迎大家留言或加羣(584017112):