当前位置: 首页 > news >正文

Spring Security+JWT问题记录

一、.security里面的Role要与数据库要一致

数据库内如下

security配置类SecurityConfig里里面roleName指定后端的权限角色名字

如下:

.requestMatchers("/ward/**").hasAnyAuthority("医生","护士","科室主任","系统管理员","院长")z这里指定Role的角色名字------就是roleName

二、后端内部的角色命名方式要一致

后端security在两个类里面设置权限角色名字

  • SecurityConfig(配置类)
  • CustomUserDetailsService(作用:把数据库用户信息拿出来给配置类,并转换为Spring Security的UserDetails对象)
public class CustomUserDetailsService implements UserDetailsService { @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 1. 从数据库查找用户 User user = userRepository.findByUsername(username) .orElseThrow(() -> new UsernameNotFoundException("用户不存在: " + username)); // 2. 获取用户的角色并转换为Spring Security权限 // 映射数据库中的角色名到权限系统中的角色名 List<SimpleGrantedAuthority> authorities = user.getRoles().stream() .map(role -> { String roleName = role.getRoleName(); String authorityName; // 角色名映射 switch (roleName) { case "ADMIN": authorityName = "系统管理员"; break; case "DOCTOR": authorityName = "医生"; break; case "NURSE": authorityName = "护士"; break; case "HEAD_NURSE": authorityName = "护士长"; break; case "DEAN": authorityName = "院长"; break; case "PHARMACIST": authorityName = "药剂师"; break; case "PATIENT": authorityName = "患者"; break; default: authorityName = roleName; } System.out.println("角色映射: " + roleName + " -> " + authorityName); return new SimpleGrantedAuthority(authorityName); }) .collect(Collectors.toList()); // 3. 转换为Spring Security的UserDetails对象 return org.springframework.security.core.userdetails.User .withUsername(user.getUsername()) .password(user.getPassword()) //密码 .disabled(!user.getEnabled()) // enabled字段 .accountExpired(false) // 根据你的业务需要调整 .accountLocked(false) //是否锁 .credentialsExpired(false) // 是否过期 .authorities(authorities) // 角色 .build(); } }

在里面CustomUserDetailsService设置rolename的地方如下

String roleName = role.getRoleName();
String authorityName;

三、CustomUserDetailsService设置中英文映射(可选)

我设置了中英文映射,因为我后端Rolename是中文,security会自动映射成英文,再返回给后端

如果你本身设置的rolename角色英文模式,就不用转了

映射模式如下

系统管理员----映射---ADMIN

医生---映射---DOCTOR

四、前端传给后端的role要和后端一致

如下,我截取了一小部分前端路由的代码

在里面的roles---指定可以访问的权限角色名字,这里要和后端一致

mport type { RouteRecordRaw } from 'vue-router' const routes: RouteRecordRaw[] = [ { path: '/login', name: 'Login', component: () => import('@/views/Login/login.vue'), meta: { title: '登录', requiresAuth: false } }, { path: '/', component: () => import('@/layouts/MainLayout.vue'), redirect: '/dashboard', meta: { requiresAuth: true }, // 父路由统一要求认证,子路由无需重复配置 children: [ { path: 'dashboard', name: 'Dashboard', component: () => import('@/views/Dashboard/index.vue'), meta: { title: '首页', roles: ['系统管理员', '医生', '护士', '院长', '科室主任', '药剂师', '患者', '财务人员'] } // 所有角色都能访问 },
http://www.cnnetsun.cn/news/14508.html

相关文章:

  • 靠谱的厦门考研哪个好选哪个
  • 高通万卫星:混合AI与分布式协同是未来 | MEET2026
  • AI图像编辑大师:InstructPix2Pix模型完全使用手册
  • 终极GASShooter游戏开发完整指南:快速构建高性能射击游戏
  • 零基础掌握Docker容器:5分钟快速上手实战指南
  • CppSharp完全指南:5步实现C++到.NET的自动化绑定
  • 解密 plum:三分钟打造你的专属 Rime 输入法生态
  • 边缘计算中的Agent资源调度难题:如何实现毫秒级响应与负载均衡?
  • 迭代器的初认识
  • 33、Linux 系统安全防护全攻略
  • 7亿参数改写边缘AI规则:LFM2-700M实现2倍推理提速与跨设备部署革命
  • AnuPpuccin Obsidian主题终极美化指南
  • 人工智能与应用
  • 3步搞定中文企业名称识别:480万语料库实战指南
  • 3步搞定ggplot2:R语言数据可视化的入门捷径
  • 主动学习集成方案:Llama-Factory减少人工标注依赖
  • 6B激活参数实现40B级性能:Ling-flash-2.0重新定义MoE模型效率标准
  • 终极Godot资源解包教程:快速提取游戏素材的完整指南
  • 37、Linux技术知识与认证全解析
  • Three.js虚拟现实开发完整指南:性能优化与开发效率提升
  • BP算法的核心思想纠正
  • 如何快速掌握Home Assistant:智能家居自动化终极指南
  • Llama-Factory安全性评估:敏感数据处理的最佳防护措施
  • WeKnora 2.0深度解析:如何构建企业级智能文档理解系统
  • Android设备性能分级终极指南:从原理到实战优化
  • Win11离线安装.NET Framework 3.5终极完整教程
  • JavaScript地理坐标计算终极指南:geodesy库完全解析
  • 37、深入探索Shell脚本:输入输出、信号控制与后台运行
  • springboot基于vue的高校人事管理系统的设计与实现_m926c77w
  • LINQ 新时代:CountBy、AggregateBy 深度解析(含对比 GroupBy)