在当今企业级应用开发中,权限管理始终是绕不开的核心模块。我见过太多项目因为初期权限设计不合理,导致后期迭代时陷入"打补丁"循环。这个基于RBAC模型的通用权限平台,正是为了解决这个痛点而生。
采用前后端分离架构(.NET后端+Vue前端),我们实现了开箱即用的权限管理体系。开发者接入后,只需简单配置就能获得完整的用户-角色-权限控制能力,不再需要重复造轮子。实测在中小型系统中,接入时间可从原来的3-5人天压缩到2小时内完成。
code复制[前端] Vue3 + TypeScript + Element Plus
↓ HTTP API
[网关] JWT鉴权 + 权限过滤
↓
[后端] .NET 6 WebAPI
↓
[持久层] EF Core + MySQL/PostgreSQL
这套技术栈的选择经过充分考量:
采用标准RBAC0模型,包含四个核心实体:
通过角色关联实现权限继承,避免给用户直接分配权限带来的维护噩梦。我们在数据库设计上做了优化:
sql复制CREATE TABLE RolePermission (
RoleId INT NOT NULL,
PermissionId INT NOT NULL,
GrantType TINYINT DEFAULT 1 -- 1:允许 0:拒绝
PRIMARY KEY (RoleId, PermissionId)
);
前端通过router.beforeEach实现路由守卫,关键代码:
typescript复制const routes = await getAsyncRoutes() // 获取当前用户有权访问的路由
routes.forEach(route => {
router.addRoute('Layout', {
path: route.path,
component: () => import(`@/views/${route.component}.vue`),
meta: { requiresAuth: true }
})
})
重要提示:动态导入的组件路径需要与后端返回的component字段严格匹配,建议建立路由组件白名单
通过自定义指令v-permission实现:
javascript复制app.directive('permission', {
mounted(el, binding) {
if (!store.state.user.permissions.includes(binding.value)) {
el.parentNode?.removeChild(el)
}
}
})
使用示例:
html复制<button v-permission="'user:delete'">删除用户</button>
.NET中间件实现权限过滤:
csharp复制app.Use(async (context, next) => {
var endpoint = context.GetEndpoint();
var attribute = endpoint?.Metadata.GetMetadata<PermissionAttribute>();
if (attribute != null && !context.User.HasClaim("permission", attribute.Name)) {
context.Response.StatusCode = 403;
return;
}
await next();
});
配合特性标注使用:
csharp复制[HttpGet("users"), Permission("user:list")]
public IActionResult GetUsers() { ... }
bash复制dotnet ef database update --project src/Permission.Core
bash复制cd frontend && pnpm install
bash复制# 后端
dotnet watch run --project src/Permission.Api
# 前端
pnpm dev
后端集成:
bash复制dotnet add package Permission.Core
csharp复制services.AddPermissionManagement(options => {
options.DbContextType = typeof(YourDbContext);
});
前端集成:
bash复制pnpm add @permission/utils
typescript复制import { setupPermission } from '@permission/utils'
app.use(setupPermission({
api: '/api/permission'
}))
csharp复制services.AddMemoryCache();
services.Decorate<IPermissionService, CachedPermissionService>();
csharp复制[HttpPost("permissions/check")]
public ActionResult<Dictionary<string,bool>> CheckPermissions([FromBody] string[] codes)
{
return codes.ToDictionary(x => x, x => User.HasClaim("permission", x));
}
问题1:新增权限后未生效
问题2:前端路由闪烁
问题3:权限越界访问
csharp复制public interface IDataPermissionFilter
{
IQueryable<T> Apply<T>(IQueryable<T> query);
}
这套系统在我们团队已稳定运行3年,支撑了20+个内部系统的权限管理。最关键的体会是:权限系统要"够用就好",过度设计反而会成为负担。建议先实现核心RBAC,再根据实际需求逐步扩展。