在现代Web应用开发中,权限管理是保障系统安全和数据隔离的核心模块。EasyUI作为一套基于jQuery的轻量级前端框架,因其简洁的UI组件和良好的兼容性,在企业级后台管理系统中广泛应用。本文将深入探讨如何基于EasyUI构建一个功能完善、可扩展性强的项目权限管理系统源码,涵盖从数据库设计、后端权限逻辑到前端菜单动态渲染的完整流程。
一、系统架构设计
权限管理系统通常采用三层架构:前端(EasyUI)、中间层(Spring Boot或Node.js等后端服务)和数据层(MySQL/PostgreSQL)。核心目标是实现RBAC(Role-Based Access Control)模型,即基于角色的访问控制。该模型通过用户-角色-权限三者关系,实现对资源的细粒度控制。
1. 数据库表结构设计
关键表包括:
• users:用户信息表(id, username, password, status)
• roles:角色表(id, name, description)
• permissions:权限表(id, code, name, description)
• user_role:用户角色关联表
• role_permission:角色权限关联表
示例SQL:
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
status TINYINT DEFAULT 1
);
CREATE TABLE roles (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) UNIQUE NOT NULL,
description TEXT
);
CREATE TABLE permissions (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
code VARCHAR(100) UNIQUE NOT NULL,
name VARCHAR(100) NOT NULL,
description TEXT
);
CREATE TABLE user_role (
user_id BIGINT,
role_id BIGINT,
PRIMARY KEY (user_id, role_id)
);
CREATE TABLE role_permission (
role_id BIGINT,
permission_id BIGINT,
PRIMARY KEY (role_id, permission_id)
);
二、后端权限逻辑实现(以Spring Boot为例)
使用Spring Security + JWT进行身份认证和授权,结合自定义权限注解实现方法级权限控制。
1. 用户登录接口
用户提交用户名密码后,后端验证并返回JWT令牌:
@PostMapping("/login")
public ResponseEntity<String> login(@RequestBody LoginRequest request) {
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(request.getUsername(), request.getPassword())
);
String token = jwtUtil.generateToken(authentication);
return ResponseEntity.ok(token);
}
2. 权限拦截器配置
通过实现OncePerRequestFilter解析JWT中的用户角色,并设置SecurityContext:
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain chain) throws ServletException, IOException {
String token = getTokenFromRequest(request);
if (token != null && jwtUtil.validateToken(token)) {
String username = jwtUtil.getUsernameFromToken(token);
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
chain.doFilter(request, response);
}
3. 动态权限校验
利用@PreAuthorize("hasAuthority('USER_READ')")注解控制API访问权限,例如:
@GetMapping("/api/users")
@PreAuthorize("hasAuthority('USER_READ')")
public List<User> getAllUsers() {
return userService.findAll();
}
三、前端EasyUI菜单动态加载
根据用户角色动态渲染左侧菜单栏,避免未授权页面暴露。
1. 获取用户权限列表
登录成功后调用接口获取当前用户的权限码集合:
$.ajax({
url: '/api/user/permissions',
type: 'GET',
headers: {'Authorization': 'Bearer ' + token},
success: function(data) {
window.userPermissions = data;
renderMenu();
}
});
2. EasyUI TreeGrid菜单渲染
使用EasyUI的treegrid组件根据权限生成树形菜单:
function renderMenu() {
var menuData = [];
$.each(menuTree, function(index, item) {
if (canAccess(item.permissionCode)) {
menuData.push(item);
}
});
$('#menu').treegrid({
data: menuData,
idField: 'id',
treeField: 'text',
columns:[[
{field:'text',title:'菜单名称',width:200}
]]
});
}
function canAccess(permissionCode) {
return window.userPermissions.includes(permissionCode);
}
四、权限细化与日志审计
除了基础的菜单权限,还应支持按钮级权限控制(如“新增”、“编辑”、“删除”按钮),并在操作时记录日志:
1. 按钮权限控制
在模板中添加条件判断:
<a href="#" class="easyui-linkbutton" data-permission="USER_CREATE">新增用户</a>
$(document).on('click', '[data-permission]', function() {
var perm = $(this).data('permission');
if (!window.userPermissions.includes(perm)) {
$.messager.alert('提示', '您没有此操作权限!');
return false;
}
});
2. 操作日志记录
每次权限相关操作都写入日志表,便于追溯:
@Aspect
@Component
public class PermissionLogAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object logPermission(ProceedingJoinPoint joinPoint) throws Throwable {
String methodName = joinPoint.getSignature().getName();
Object result = joinPoint.proceed();
logService.saveLog(SecurityContextHolder.getContext().getAuthentication().getName(),
methodName, "PERMISSION_CHECKED");
return result;
}
}
五、源码组织建议
推荐采用模块化结构,便于维护和扩展:
- auth:权限认证模块(JWT、登录、登出)
- role:角色管理模块(CRUD)
- permission:权限管理模块(增删改查)
- menu:菜单动态加载模块(前端渲染)
- log:操作日志模块(审计追踪)
六、常见问题与解决方案
- 权限未生效?检查是否正确注入了SecurityContext,或是否有缓存导致权限未刷新。
- 菜单显示异常?确认权限码是否一致,前后端权限码映射需严格匹配。
- 性能瓶颈?对权限数据做缓存(Redis),减少数据库查询压力。
七、总结
通过以上步骤,我们可以构建一个基于EasyUI的完整权限管理系统源码。这套方案不仅实现了基础的RBAC模型,还融合了JWT认证、动态菜单渲染、按钮级权限控制以及操作日志审计,适用于中小型企业内部系统的快速搭建。未来还可引入RBAC+ABAC混合模型提升灵活性,或集成LDAP/SSO实现单点登录,进一步增强系统的安全性与易用性。

