Vue 3 + Spring Security 6 权限管理实战:5步实现动态路由与按钮级控制
Vue 3 Spring Security 6 权限管理实战动态路由与按钮级控制全解析现代权限管理系统的技术演进在前后端分离架构成为主流的今天权限管理系统面临着全新的技术挑战与机遇。传统的单体应用中权限控制往往通过服务端模板渲染和会话管理实现而在现代SPA应用中前端需要承担更多的交互逻辑同时保持与后端权限系统的无缝对接。Vue 3作为当前最流行的前端框架之一其组合式API和响应式系统的改进为复杂权限逻辑的实现提供了更优雅的解决方案。与此同时Spring Security 6在JWT支持、OAuth2集成和响应式编程等方面进行了全面升级使得后端权限控制更加灵活和安全。环境准备与项目初始化1.1 技术栈选型与版本确认在开始之前请确保您的开发环境满足以下要求Node.js16.x或更高版本Java17Spring Security 6的最低要求Vue CLI5.x或ViteSpring Boot3.x# 检查Node版本 node -v # 检查Java版本 java -version # 创建Vue项目如使用Vite npm init vuelatest vue3-security-demo1.2 初始化Spring Boot项目使用Spring Initializr创建项目时需要包含以下依赖Spring WebSpring SecurityLombokJJWT (用于JWT令牌处理)MySQL Driver (或其他数据库驱动)!-- pom.xml关键依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-security/artifactId /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-api/artifactId version0.11.5/version /dependencySpring Security 6核心配置2.1 JWT认证流程实现Spring Security 6中我们需要自定义SecurityFilterChain来配置认证流程Configuration EnableWebSecurity public class SecurityConfig { Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf(csrf - csrf.disable()) .authorizeHttpRequests(auth - auth .requestMatchers(/api/auth/**).permitAll() .anyRequest().authenticated() ) .sessionManagement(session - session .sessionCreationPolicy(SessionCreationPolicy.STATELESS) ) .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); } Bean public JwtAuthenticationFilter jwtAuthenticationFilter() { return new JwtAuthenticationFilter(); } }2.2 自定义UserDetailsService实现用户详情服务用于从数据库加载用户信息Service RequiredArgsConstructor public class UserDetailsServiceImpl implements UserDetailsService { private final UserRepository userRepository; Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user userRepository.findByUsername(username) .orElseThrow(() - new UsernameNotFoundException(用户不存在)); return new org.springframework.security.core.userdetails.User( user.getUsername(), user.getPassword(), getAuthorities(user.getRoles()) ); } private Collection? extends GrantedAuthority getAuthorities(SetRole roles) { return roles.stream() .flatMap(role - role.getPermissions().stream()) .map(permission - new SimpleGrantedAuthority(permission.getName())) .collect(Collectors.toSet()); } }Vue 3动态路由实现3.1 路由模块设计创建Vue Router实例时我们需要区分常量路由和动态路由// router/index.js import { createRouter, createWebHistory } from vue-router const constantRoutes [ { path: /login, component: () import(/views/Login.vue), meta: { public: true } }, { path: /404, component: () import(/views/404.vue), meta: { public: true } } ] const router createRouter({ history: createWebHistory(), routes: constantRoutes }) // 动态添加路由的方法 export function addRoutes(routes) { routes.forEach(route { router.addRoute(route) }) } export default router3.2 权限路由过滤逻辑在用户登录后根据返回的权限信息过滤动态路由// 示例路由配置 const asyncRoutes [ { path: /user, component: Layout, meta: { permission: user:view }, children: [ { path: list, component: () import(/views/user/List.vue), meta: { permission: user:list } } ] } ] // 路由过滤函数 export function filterRoutes(routes, permissions) { return routes.filter(route { if (route.meta?.permission) { return permissions.includes(route.meta.permission) } if (route.children) { route.children filterRoutes(route.children, permissions) return route.children.length 0 } return true }) }Pinia状态管理与权限持久化4.1 用户状态存储设计使用Pinia管理用户状态和权限信息// stores/auth.js import { defineStore } from pinia import { ref } from vue export const useAuthStore defineStore(auth, () { const user ref(null) const permissions ref([]) const routes ref([]) function setUser(userInfo) { user.value userInfo // 从用户信息中提取权限 permissions.value userInfo.permissions || [] } function setRoutes(routeList) { routes.value routeList } return { user, permissions, routes, setUser, setRoutes } })4.2 解决刷新权限丢失问题利用sessionStorage持久化权限信息// 在登录成功后 const login async (credentials) { const response await api.login(credentials) authStore.setUser(response.data.user) sessionStorage.setItem(user, JSON.stringify(response.data.user)) // 过滤并添加动态路由 const filteredRoutes filterRoutes(asyncRoutes, response.data.user.permissions) addRoutes(filteredRoutes) authStore.setRoutes(filteredRoutes) } // 应用初始化时恢复状态 const initAuth () { const userJson sessionStorage.getItem(user) if (userJson) { const user JSON.parse(userJson) authStore.setUser(user) const filteredRoutes filterRoutes(asyncRoutes, user.permissions) addRoutes(filteredRoutes) authStore.setRoutes(filteredRoutes) } }按钮级权限控制实现5.1 自定义权限指令创建Vue指令来控制按钮级别的权限// directives/permission.js export const permission { mounted(el, binding) { const authStore useAuthStore() const { value } binding if (value Array.isArray(value)) { const hasPermission authStore.permissions.some(permission { return value.includes(permission) }) if (!hasPermission) { el.parentNode?.removeChild(el) } } else { throw new Error(需要指定权限数组如v-permission[user:create]) } } } // main.js中全局注册 import { permission } from /directives/permission app.directive(permission, permission)5.2 组件中的使用示例在模板中使用权限指令控制按钮显示template div button v-permission[user:create]新增用户/button button v-permission[user:edit]编辑用户/button /div /template安全增强与最佳实践6.1 后端接口安全防护即使前端进行了权限控制后端也必须进行二次验证RestController RequestMapping(/api/users) public class UserController { PreAuthorize(hasAuthority(user:list)) GetMapping public ResponseEntityListUser listUsers() { // 业务逻辑 } PreAuthorize(hasAuthority(user:create)) PostMapping public ResponseEntityUser createUser(RequestBody User user) { // 业务逻辑 } }6.2 敏感操作日志记录使用Spring AOP记录关键操作Aspect Component RequiredArgsConstructor public class OperationLogAspect { private final OperationLogService logService; Around(annotation(operationLog)) public Object around(ProceedingJoinPoint joinPoint, OperationLog operationLog) throws Throwable { String methodName joinPoint.getSignature().getName(); Object[] args joinPoint.getArgs(); // 获取当前用户 Authentication authentication SecurityContextHolder.getContext().getAuthentication(); String username authentication.getName(); long startTime System.currentTimeMillis(); Object result joinPoint.proceed(); long endTime System.currentTimeMillis(); // 记录日志 logService.saveLog( username, operationLog.value(), methodName, args, result, endTime - startTime ); return result; } }性能优化与调试技巧7.1 路由懒加载优化对动态路由进行代码分割提升首屏加载速度const asyncRoutes [ { path: /system, component: () import(/layout/SystemLayout.vue), children: [ { path: settings, component: () import(/* webpackChunkName: system-settings */ /views/system/Settings.vue) } ] } ]7.2 权限系统调试方法开发过程中可以使用以下工具辅助调试Spring Security Debug Filter在开发环境中启用# application-dev.properties logging.level.org.springframework.securityDEBUGVue Devtools检查Pinia状态和路由信息API测试工具Postman或Insomnia测试权限接口迁移与升级注意事项8.1 从Vue 2迁移到Vue 3需要注意以下变化Vuex替换为Piniavue-router的API变化组合式API替代选项式API自定义指令的生命周期钩子变化8.2 从Spring Security 5升级到6主要变更点包括WebSecurityConfigurerAdapter被弃用新的Lambda DSL配置风格默认的CSRF保护行为变化密码编码器的推荐实现变更常见问题解决方案9.1 路由刷新白屏问题解决方案确保服务器配置了所有路由的重定向到index.html检查动态路由添加时机验证权限恢复逻辑是否正确9.2 JWT过期处理策略实现无感知刷新方案// axios响应拦截器 instance.interceptors.response.use( response response, async error { const originalRequest error.config if (error.response.status 401 !originalRequest._retry) { originalRequest._retry true try { const { data } await authApi.refreshToken() setNewToken(data.token) originalRequest.headers.Authorization Bearer ${data.token} return instance(originalRequest) } catch (refreshError) { logout() return Promise.reject(refreshError) } } return Promise.reject(error) } )项目部署与监控10.1 生产环境配置建议前端部署启用Gzip压缩使用CDN加速静态资源配置合适的缓存策略后端部署启用HTTPS配置合理的CORS策略使用环境变量管理敏感信息10.2 监控与告警集成Spring Boot Actuator进行健康检查Configuration public class ActuatorConfig { Bean public SecurityFilterChain actuatorSecurity(HttpSecurity http) throws Exception { http .securityMatcher(/actuator/**) .authorizeHttpRequests(auth - auth .requestMatchers(/actuator/health).permitAll() .anyRequest().hasRole(ADMIN) ) .httpBasic(); return http.build(); } }

相关新闻

仅限内部团队验证的Cursor-Supabase私有集成协议(v2.1):绕过Rate Limit、启用增量schema watch、支持Row Level Debugging

仅限内部团队验证的Cursor-Supabase私有集成协议(v2.1):绕过Rate Limit、启用增量schema watch、支持Row Level Debugging

更多请点击: https://intelliparadigm.com 第一章:Cursor-Supabase私有集成协议(v2.1)概览 Cursor-Supabase私有集成协议(v2.1)是一套面向前端开发者的轻量级、端到端加密的客户端-服务端通信规范&#xf…

2026/7/11 9:54:32阅读更多 →
紧急通知:Cursor v0.41+已弃用host-mode socket通信!立即迁移至Docker bridge网络的4步安全升级方案(含兼容性检测脚本)

紧急通知:Cursor v0.41+已弃用host-mode socket通信!立即迁移至Docker bridge网络的4步安全升级方案(含兼容性检测脚本)

更多请点击: https://kaifayun.com 第一章:Cursor Docker环境搭建 Cursor 是一款基于 VS Code 的 AI 增强型代码编辑器,支持通过 Docker 容器化方式部署本地开发环境,尤其适用于需要隔离依赖、复现一致构建上下文的团队协作场景。…

2026/7/11 9:54:32阅读更多 →
L9958与MK51DN512CLQ10的直流电机高精度控制方案

L9958与MK51DN512CLQ10的直流电机高精度控制方案

1. 项目概述:L9958与MK51DN512CLQ10的电机控制方案 在工业自动化和精密控制领域,直流电机驱动系统的性能优化一直是工程师面临的挑战。本项目采用意法半导体的L9958电机驱动芯片与NXP的MK51DN512CLQ10微控制器构建高性能驱动方案,实现了对直流…

2026/7/11 9:54:32阅读更多 →
OpCore Simplify:黑苹果新手的终极解决方案,5分钟完成OpenCore EFI配置

OpCore Simplify:黑苹果新手的终极解决方案,5分钟完成OpenCore EFI配置

OpCore Simplify:黑苹果新手的终极解决方案,5分钟完成OpenCore EFI配置 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为…

2026/7/11 10:49:40阅读更多 →
order-book-dynamics终极指南:使用支持向量机建模高频限价订单簿动态

order-book-dynamics终极指南:使用支持向量机建模高频限价订单簿动态

order-book-dynamics终极指南:使用支持向量机建模高频限价订单簿动态 【免费下载链接】orderbook-dynamics Modeling high-frequency limit order book dynamics with support vector machines 项目地址: https://gitcode.com/gh_mirrors/or/orderbook-dynamics …

2026/7/11 10:49:40阅读更多 →
实战指南:3步将闲置电视盒变身高性能Linux服务器

实战指南:3步将闲置电视盒变身高性能Linux服务器

实战指南:3步将闲置电视盒变身高性能Linux服务器 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk3588, rk356…

2026/7/11 10:49:40阅读更多 →
Scala Notebook用户指南:从代码编写到结果渲染的完整流程 [特殊字符]

Scala Notebook用户指南:从代码编写到结果渲染的完整流程 [特殊字符]

Scala Notebook用户指南:从代码编写到结果渲染的完整流程 🚀 【免费下载链接】scala-notebook Interactive Scala REPL in a browser 项目地址: https://gitcode.com/gh_mirrors/sc/scala-notebook Scala Notebook是一个基于浏览器的交互式Scala …

2026/7/11 10:49:40阅读更多 →
KASandbox性能优化实战:提升容器调度效率的7个技巧

KASandbox性能优化实战:提升容器调度效率的7个技巧

KASandbox性能优化实战:提升容器调度效率的7个技巧 【免费下载链接】KASandbox This repository contains the core orchestration services, CRI multiplexing shim, and infrastructure components that power the KASandbox platform. 项目地址: https://gitco…

2026/7/11 10:49:40阅读更多 →
Midjourney 3D渲染效果失效的4大陷阱:分辨率缩放悖论、视角畸变阈值、材质ID冲突、UV展开偏移——实测数据支撑

Midjourney 3D渲染效果失效的4大陷阱:分辨率缩放悖论、视角畸变阈值、材质ID冲突、UV展开偏移——实测数据支撑

更多请点击: https://kaifayun.com 第一章:Midjourney 3D渲染效果失效的全局认知 Midjourney 自 V6 起强化了对 3D 风格提示词(如 --style 3d、 --v 6.1)的语义理解,但大量用户反馈“3D渲染效果未生效”并非单一参数…

2026/7/11 10:44:39阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/10 12:10:00阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/10 12:29:21阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/10 4:59:05阅读更多 →
Premiere Pro 2025安装失败原因与AGSIS验证绕过指南

Premiere Pro 2025安装失败原因与AGSIS验证绕过指南

1. 为什么2025版PR安装比以往更“磨人”?——从弹窗警告到路径陷阱的真实处境 Premiere Pro 2025版不是简单的一次版本迭代,它是一道分水岭。我从去年底开始帮影视工作室、高校剪辑实验室和自由职业者部署2025环境,累计处理了137台设备&#…

2026/7/11 0:03:43阅读更多 →
5款实用macOS系统优化工具:让你的Mac运行更流畅更高效

5款实用macOS系统优化工具:让你的Mac运行更流畅更高效

5款实用macOS系统优化工具:让你的Mac运行更流畅更高效 【免费下载链接】open-source-mac-os-apps 🚀 Awesome list of open source applications for macOS. https://t.me/s/opensourcemacosapps 项目地址: https://gitcode.com/gh_mirrors/op/open-so…

2026/7/11 0:03:43阅读更多 →
5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成真正听从你的指挥吗&…

2026/7/11 0:03:43阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/10 13:39:09阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/10 22:20:33阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/10 17:29:22阅读更多 →