若依(RuoYi)框架是一个基于Spring Boot和Spring Cloud的开源快速开发平台,以其简洁、高效、易于扩展的特点受到开发者青睐。权限管理是任何系统中不可或缺的一部分,本文将深入解析若依框架中权限管理的实现机制。
在若依框架中,权限管理主要分为以下几个方面:
这些概念通过数据库表、代码逻辑和前端界面紧密结合,共同构成了完整的权限管理体系。
若依框架的权限管理依赖于以下核心表:
sys_user:存储用户信息。
user_id
(主键)、username
(用户名)、password
(密码)等。sys_role:存储角色信息。
role_id
(主键)、role_name
(角色名称)、role_key
(角色标识)等。sys_menu:存储菜单信息。
menu_id
(主键)、menu_name
(菜单名称)、perms
(权限标识)、parent_id
(父菜单ID)等。sys_role_menu:角色与菜单的关联表。
role_id
和 menu_id
。sys_user_role:用户与角色的关联表。
user_id
和 role_id
。这些表通过外键关系相互关联,实现了用户、角色和菜单之间的多对多映射。
用户登录时,系统会验证用户名和密码是否正确。若认证成功,会生成一个JWT(JSON Web Token),并将用户的角色和权限信息嵌入到Token中。
// 登录认证示例代码
public String login(String username, String password) {
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
if (new BCryptPasswordEncoder().matches(password, userDetails.getPassword())) {
// 生成JWT Token
return JwtTokenUtil.generateToken(userDetails);
}
throw new RuntimeException("登录失败");
}
在请求拦截器中,系统会解析JWT Token,提取用户的角色和权限信息,并将其绑定到当前线程。
// 请求拦截器示例代码
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
String token = request.getHeader("Authorization");
if (JwtTokenUtil.validateToken(token)) {
String username = JwtTokenUtil.getUsernameFromToken(token);
List<String> permissions = JwtTokenUtil.getPermissionsFromToken(token);
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(username, null, getAuthorities(permissions));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
chain.doFilter(request, response);
}
private Collection<? extends GrantedAuthority> getAuthorities(List<String> permissions) {
return permissions.stream()
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toList());
}
}
若依框架采用前后端分离架构,前端通过接口调用获取用户的菜单和权限信息,并动态渲染页面。
后端提供接口 /system/menu/list
,返回用户可访问的菜单列表。
@RestController
@RequestMapping("/system/menu")
public class MenuController {
@Autowired
private IMenuService menuService;
@GetMapping("/list")
public List<SysMenu> getMenuList() {
Long userId = SecurityUtils.getUserId();
return menuService.selectMenuTreeByUserId(userId);
}
}
前端根据返回的菜单数据,使用Vue或Element-UI等框架动态生成左侧导航栏。
数据权限管理用于限制用户只能查看自己有权限的数据。若依框架通过SQL拦截器实现数据权限过滤。
data_scope
,定义数据权限范围(如“全部数据”、“本部门数据”、“本人数据”等)。graph TD; A[用户发起查询] --> B[拦截SQL]; B --> C{判断是否有数据权限}; C --是--> D[添加数据权限条件]; C --否--> E[直接执行查询];