用户A在不退出系统情况下, 管理员添加新权限,刷新获取菜单接口,用户A即可看到最新角色对应菜单
4条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
在Spring Security OAuth2中实现动态修改权限并实时刷新菜单,通常需要以下关键步骤:
- 动态权限管理:
- 在数据库中维护用户与权限的关系,并设计一种机制来动态更新这些关系。
- 当管理员添加或删除权限时,你需要触发一个事件或者调用一个服务方法,用于更新用户的角色和权限信息。
// 假设有一个UserService用来处理权限变更 @Service public class UserService { @Autowired private UserRoleRepository userRoleRepository; public void updateUserRoles(String userId, List<String> newRoleNames) { // 根据userId移除旧角色,添加新角色 // 这里假设UserRole是一个代表用户-角色关系的实体类 userRoleRepository.removeByUserId(userId); for (String roleName : newRoleNames) { UserRole role = new UserRole(userId, roleName); userRoleRepository.save(role); } } }
- 权限缓存管理:
- Spring Security默认会缓存用户的授权信息,因此当权限发生变化时,需要能够清除缓存或使其失效。
- 可以使用
OAuth2AuthorizationService
(如果是OAuth2 Resource Server)或SecurityContextHolder.clearContext()
来刷新当前用户的上下文。
@Autowired private OAuth2AuthorizationService authorizationService; public void invalidateUserAuthorization(String userId) { // 清除特定用户的所有OAuth2授权信息 // 注意:实际代码可能因具体的OAuth2库而异 authorizationService.findByPrincipalName(userId).forEach(authorization -> authorizationService.remove(authorization)); }
-
权限刷新策略:
- 对于前端菜单的实时更新,可以采用 WebSocket、长轮询或定期刷新等机制。
- 当权限更改后,服务器端发送一个通知到客户端,客户端收到通知后重新获取菜单列表。
-
接口权限控制与菜单数据获取:
- 使用Spring Security的注解如
@PreAuthorize
根据用户实时权限控制接口访问。 - 创建一个API供前端调用以获取用户当前拥有的菜单列表,该列表应基于用户的最新权限生成。
- 使用Spring Security的注解如
@GetMapping("/user/menu") @PreAuthorize("hasAnyAuthority('ROLE_ADMIN', 'ROLE_USER')") public List<MenuDTO> getUserMenus() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities(); // 根据用户权限获取对应的菜单列表 List<Menu> menus = menuService.findMenusByAuthorities(authorities.stream() .map(GrantedAuthority::getAuthority) .collect(Collectors.toList())); return menuMapper.toDto(menus); }
- 整合WebSocket或推送机制:
- 当权限更新时,通过WebSocket向指定用户发送消息,通知前端重新加载菜单数据。
请结合实际情况调整上述示例代码。由于篇幅限制以及没有具体的应用场景代码,以上仅为概念性演示,实际应用时需针对你的项目结构和所使用的Spring Security OAuth2版本进行相应的定制和优化。
解决 无用评论 打赏 举报- 动态权限管理:
悬赏问题
- ¥100 需要跳转番茄畅听app的adb命令
- ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
- ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
- ¥50 opencv4nodejs 如何安装
- ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
- ¥15 nginx反向代理获取ip,java获取真实ip
- ¥15 eda:门禁系统设计
- ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
- ¥15 376.1电表主站通信协议下发指令全被否认问题
- ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证