
SpringBoot+Shiro配置数据库实现后台管理页面根据角色权限动态生成菜单栏
user表:存储用户信息。 user_role表:记录用户与角色的关系。 role表:存储系统角色信息。 permission表:存储系统权限信息。 role_permission表:记录角色与权限的映射关系。 menu表:存储菜单信息。 menu_move表:存储菜单之间的操作关系。 menu_permission表:存储菜单与权限的映射关系。
发布日期:2021-05-15 00:00:26
浏览次数:15
分类:精选文章
本文共 4819 字,大约阅读时间需要 16 分钟。
SpringBoot + Shiro后台管理系统权限配置方案
前言
使用SpringBoot和Shiro搭建后台管理系统时,传统的权限验证方式是通过在HTML页面中嵌入Shiro标签直接验证用户权限。这种方法虽然简单,但在菜单数量较多时容易导致页面臃肿,并且需要手动管理权限标识,容易出错。本文将介绍一种通过动态从数据库获取权限信息的方法,将菜单栏生成到页面中,解决传统方法的不足。
数据库设计
为了实现动态生成菜单栏,我们需要设计一个完整的数据库架构,包含以下表:
系统实现
Controller
@GetMapping("/index")public String login(Model model) { if (!subject.isAuthenticated()) { return "/login"; } String username = subject.getPrincipal().toString(); List
Service
public interface MenuService extends IService { List
Service Implementation
@Servicepublic class MenuServiceImpl extends ServiceImpl { private MenuMapper menuMapper; @Override public List
Mapper
public interface MenuMapper extends BaseMapper { List
XML映射文件
VO对象
@Datapublic class Menu { private Long id; private String menuName; private String menuUrl; private String menuIcon; private List
页面渲染
Shiro配置
ShiroConfig
@Bean("shiroFilter")public ShiroFilterFactoryBean shiroFilter(@Qualifier("securityManager") SecurityManager manager) { ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); bean.setSecurityManager(manager); bean.setLoginUrl("/login"); bean.setSuccessUrl("/index"); bean.setUnauthorizedUrl("/auth.html"); MapfilterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/index", "anon"); filterChainDefinitionMap.put("/login", "anon"); filterChainDefinitionMap.put("/static/**", "anon"); filterChainDefinitionMap.put("/swagger-ui.html", "anon"); filterChainDefinitionMap.put("/swagger-resources", "anon"); filterChainDefinitionMap.put("/api/**", "anon"); List permissionList = permissionMapper.getAll(); for (Permission permission : permissionList) { filterChainDefinitionMap.put(permission.getResource(), "perms["+permission.getSn()+"]"); } filterChainDefinitionMap.put("/**", "anon"); bean.setFilterChainDefinitionMap(filterChainDefinitionMap); return bean;}
PermissionMapper
public interface PermissionMapper extends BaseMapper { ListgetAll(); List getPermissionsByUserName(String username);}
XML映射文件
RoleMapper
public interface RoleMapper extends BaseMapper { ListgetRolesByUserName(String username);}
XML映射文件
PermissionMapper
@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { log.info("Shiro开始授权操作"); String username = SecurityUtils.getSubject().getPrincipal().toString(); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); Setroles = new HashSet<>(); List rolesList = roleMapper.getRolesByUserName(username); for (Role role : rolesList) { roles.add(role.getRoleName()); } List permissionsList = permissionMapper.getPermissionsByUserName(username); for (Permission permission : permissionsList) { authorizationInfo.addStringPermission(permission.getSn()); } authorizationInfo.setRoles(roles); return authorizationInfo;}
总结
通过这种方法,动态生成菜单栏的优点非常明显:只需在数据库中添加数据即可,无需手动管理Shiro标签,减少页面臃肿,提高可维护性。如果需要更具体的实现细节,可以参考全文获取完整代码。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月11日 16时19分48秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Hadoop学习笔记—Yarn
2019-03-06
JSONPath小试牛刀之Snack3
2019-03-06
Jenkins - 部署在Tomcat容器里的Jenkins,提示“反向代理设置有误”
2019-03-06
wxWidgets源码分析(3) - 消息映射表
2019-03-06
wxWidgets源码分析(5) - 窗口管理
2019-03-06
wxWidgets源码分析(7) - 窗口尺寸
2019-03-06
wxWidgets源码分析(8) - MVC架构
2019-03-06
wxWidgets源码分析(9) - wxString
2019-03-06
[白话解析] 深入浅出熵的概念 & 决策树之ID3算法
2019-03-06
[梁山好汉说IT] 梁山好汉和抢劫银行
2019-03-06
[源码解析] 消息队列 Kombu 之 基本架构
2019-03-06
[源码分析] 消息队列 Kombu 之 启动过程
2019-03-06
抉择之苦
2019-03-06
wx.NET CLI wrapper for wxWidgets
2019-03-06
ASP.NET MVC Action Filters
2019-03-06
Powershell中禁止执行脚本解决办法
2019-03-06
HTTP协议状态码详解(HTTP Status Code)
2019-03-06
OO_Unit2 多线程电梯总结
2019-03-06