一、需求
不同权限的用户登录后台管理系统时,需要展示不同的菜单,不同的用户有不同的权限嘛。那这个需求该如何实现呢?
二、设计思路
我们这样来思考。
对于用户权限控制的设计主要涉及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):
来源:CSDN
作者:小、云
链接:https://blog.csdn.net/u012586848/article/details/104000626