classaddbug 2024-02-02 23:28 采纳率: 0%
浏览 11

spring security oauth2 动态修改权限

用户A在不退出系统情况下, 管理员添加新权限,刷新获取菜单接口,用户A即可看到最新角色对应菜单

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-02 23:31
    关注

    引自免费微信小程序:皆我百晓生

    在Spring Security OAuth2中实现动态修改权限并实时刷新菜单,通常需要以下关键步骤:

    1. 动态权限管理
      • 在数据库中维护用户与权限的关系,并设计一种机制来动态更新这些关系。
      • 当管理员添加或删除权限时,你需要触发一个事件或者调用一个服务方法,用于更新用户的角色和权限信息。
    // 假设有一个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);
            }
        }
    }
    
    1. 权限缓存管理
      • 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));
    }
    
    1. 权限刷新策略

      • 对于前端菜单的实时更新,可以采用 WebSocket、长轮询或定期刷新等机制。
      • 当权限更改后,服务器端发送一个通知到客户端,客户端收到通知后重新获取菜单列表。
    2. 接口权限控制与菜单数据获取

      • 使用Spring Security的注解如@PreAuthorize根据用户实时权限控制接口访问。
      • 创建一个API供前端调用以获取用户当前拥有的菜单列表,该列表应基于用户的最新权限生成。
    @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);
    }
    
    1. 整合WebSocket或推送机制
      • 当权限更新时,通过WebSocket向指定用户发送消息,通知前端重新加载菜单数据。

    请结合实际情况调整上述示例代码。由于篇幅限制以及没有具体的应用场景代码,以上仅为概念性演示,实际应用时需针对你的项目结构和所使用的Spring Security OAuth2版本进行相应的定制和优化。

    评论

报告相同问题?

问题事件

  • 修改了问题 2月2日
  • 创建了问题 2月2日

悬赏问题

  • ¥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关系验证