角色权限系统
角色权限系统RBAC最全设计Java 落地 表结构 接口方案我给你企业级最标准、面试必问、开发直接用的RBAC 权限系统设计从表结构 → 业务模型 → Java 实现 → 前端控制一次性讲透。你做后台管理、RAG 知识库权限、用户权限隔离直接照搬这套。一、一句话记住权限系统 RBAC 模型RBAC Role-Based Access Control基于角色的访问控制核心思想用户 ← 多对多 → 角色 ← 多对多 → 权限一个用户有多个角色一个角色有多个权限权限 菜单/按钮/接口/数据二、最经典 5 张表生产标准表结构这 5 张表能满足 99% 后台系统。-- 1. 用户表CREATETABLEsys_user(idBIGINTPRIMARYKEYAUTO_INCREMENT,usernameVARCHAR(50)NOTNULLUNIQUE,passwordVARCHAR(100)NOTNULL,nicknameVARCHAR(50),is_adminTINYINTDEFAULT0COMMENT1超级管理员,create_timeDATETIMEDEFAULTNOW());-- 2. 角色表CREATETABLEsys_role(idBIGINTPRIMARYKEYAUTO_INCREMENT,role_nameVARCHAR(50)NOTNULL,role_codeVARCHAR(50)NOTNULLUNIQUE,remarkVARCHAR(255));-- 3. 权限表CREATETABLEsys_permission(idBIGINTPRIMARYKEYAUTO_INCREMENT,perm_nameVARCHAR(50)NOTNULL,perm_codeVARCHAR(100)NOTNULLUNIQUECOMMENT如 user:list, doc:upload,perm_typeVARCHAR(20)COMMENTmenu/button/api,parent_idBIGINTDEFAULT0,sortINTDEFAULT0);-- 4. 用户-角色关联表CREATETABLEsys_user_role(idBIGINTPRIMARYKEYAUTO_INCREMENT,user_idBIGINTNOTNULL,role_idBIGINTNOTNULL);-- 5. 角色-权限关联表CREATETABLEsys_role_perm(idBIGINTPRIMARYKEYAUTO_INCREMENT,role_idBIGINTNOTNULL,perm_idBIGINTNOTNULL);-- 初始化数据INSERTINTOsys_user(username,password,is_admin)VALUES(admin,123456,1);INSERTINTOsys_role(role_name,role_code)VALUES(管理员,admin),(访客,guest);INSERTINTOsys_permission(perm_name,perm_code)VALUES(用户列表,user:list),(新增用户,user:add),(知识库查看,doc:view),(文档上传,doc:upload);三、权限三种粒度你一定会用到1. 菜单权限看得见哪些菜单2. 按钮权限新增、删除、编辑3. 接口权限API 能不能调用4. 数据权限可选高级只能看自己/部门/全部数据四、核心设计逻辑最关键1. 登录流程用户登录查用户 → 查角色 → 查权限把权限编码集合存入 Redisuser:1001:permissions → [user:list,user:add,doc:view]2. 鉴权流程前端按钮/菜单根据权限码显示/隐藏后端接口加PreAuthorize(“hasPermission(‘user:add’)”)拦截器从 Redis 取用户权限 → 判断是否包含当前接口权限码五、Java 实现SpringBoot Security 最标准1. 核心步骤登录时加载用户所有权限存入 Redis每次请求走拦截器鉴权2. 核心代码获取用户权限// 根据用户ID查所有权限用户→角色→权限SetStringgetPermissionCodesByUserId(LonguserId){// 1. 查用户角色ListLongroleIdsuserRoleMapper.listByUserId(userId);// 2. 查角色权限SetStringpermCodesrolePermMapper.listPermCodesByRoleIds(roleIds);returnpermCodes;}3. Redis 存储权限key: user:{userId}:permissions value: SetString 权限编码4. 接口鉴权注解/拦截器GetMapping(/user/list)PreAuthorize(hasPermission(user:list))publicResultlist(){returnuserService.list();}六、前端权限控制按钮/菜单!-- 按钮权限 -- el-button v-ifhasPerm(user:add)新增用户/el-button// 判断是否有权限hasPerm(permCode){returnuserPermissions.includes(permCode);}七、超级管理员怎么设计if (user.isAdmin true) { // 直接拥有所有权限 return ALL_PERMISSIONS; }八、RBAC 版本演进面试加分RBAC0基础版用户-角色-权限RBAC1角色继承管理员继承普通角色权限RBAC2角色约束互斥角色、最大人数RBAC3最完整RBAC1 RBAC2企业 99% 用 RBAC0。九、你做 RAG 系统权限怎么用直接套角色管理员、编辑、访客权限知识库查看、文档上传、问答、删除文档用户 → 角色 → 权限问答/检索时只能检索当前用户有权限的文档十、一句话总结背这个用户绑定角色角色绑定权限登录查权限存入Redis前端按钮判断、后端接口判断。