简介:本文详细记录了前后端分离权限管理系统的开发过程,包括技术选型、架构设计、权限模型实现及安全优化,为开发者提供实战指南。
在微服务架构与云原生技术快速发展的背景下,前后端分离权限管理系统已成为企业级应用的核心组件。本文从技术选型、架构设计、权限模型实现、接口安全及性能优化五个维度,系统阐述基于Spring Security + JWT的前后端分离权限管理系统的开发实践,结合代码示例与最佳实践,为开发者提供可落地的解决方案。
前后端分离架构下,技术栈的合理性直接影响系统扩展性与维护成本。推荐组合:
关键考量:
@CrossOrigin注解或Nginx配置解决前后端分离的跨域问题。{code: 200, data: {}, message: ""})。采用经典三层架构:
示例:跨域配置
@Configurationpublic class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "PUT", "DELETE").allowedHeaders("*").allowCredentials(true).maxAge(3600);}}
基于角色访问控制(RBAC)模型,扩展为RBAC2,支持数据权限与操作权限分离:
ADMIN、USER。menu:list)、按钮权限(user:delete)、数据权限(department:view)。数据库设计:
CREATE TABLE sys_permission (id BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL COMMENT '权限名称',permission_type TINYINT NOT NULL COMMENT '1-菜单 2-按钮 3-数据',url VARCHAR(200) COMMENT '菜单URL',perms VARCHAR(50) COMMENT '权限标识');CREATE TABLE sys_role_permission (role_id BIGINT NOT NULL,permission_id BIGINT NOT NULL,PRIMARY KEY (role_id, permission_id));
通过注解@PreAuthorize实现方法级权限控制:
@RestController@RequestMapping("/api/user")public class UserController {@GetMapping("/list")@PreAuthorize("hasAuthority('user:list')")public Result list() {// 返回用户列表}@DeleteMapping("/{id}")@PreAuthorize("hasAuthority('user:delete')")public Result delete(@PathVariable Long id) {// 删除用户}}
username/password,后端验证后生成JWT令牌。Authorization: Bearer <token>。JwtAuthenticationTokenFilter解析。关键代码:
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain chain) {String token = request.getHeader("Authorization");if (StringUtils.isNotBlank(token)) {Claims claims = Jwts.parser().setSigningKey("your-secret-key").parseClaimsJws(token.replace("Bearer ", "")).getBody();UsernamePasswordAuthenticationToken authToken =new UsernamePasswordAuthenticationToken(claims.getSubject(), null, null);SecurityContextHolder.getContext().setAuthentication(authToken);}chain.doFilter(request, response);}}
@Async注解将日志写入异步队列,避免阻塞主流程。问题:角色权限变更后,已登录用户权限未及时刷新。
方案:
/api/refresh-token接口,重新生成JWT并返回新权限。问题:不同角色查看的数据范围不同(如部门数据隔离)。
方案:
WHERE department_id = ?条件。@DataPermission注解,通过AOP实现数据过滤。示例:数据权限注解
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface DataPermission {String[] deptFields() default {}; // 部门字段名}@Aspect@Componentpublic class DataPermissionAspect {@Around("@annotation(dataPermission)")public Object around(ProceedingJoinPoint joinPoint, DataPermission dataPermission) {// 解析当前用户部门ID,动态修改SQL参数}}
前后端分离权限管理系统的开发需兼顾安全性、灵活性与性能。通过RBAC2模型、JWT认证、动态权限加载等技术,可构建高可用的权限管理体系。未来可探索:
最终建议:开发过程中需严格遵循最小权限原则,定期进行安全审计,确保系统符合等保2.0要求。