导航: 首页 > 开发技术 > 如何使用SpringSecurity实现动态加载权限信息 发表于:2026-11-03 作者:千家信息网编辑 千家信息网最后更新 2026年11月03日,这篇文章主要介绍了如何使用SpringSecurity实现动态加载权限信息,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。①数据库中资源 千家信息网最后更新 2026年11月03日如何使用SpringSecurity实现动态加载权限信息这篇文章主要介绍了如何使用SpringSecurity实现动态加载权限信息,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。①数据库中资源与角色对应关系,以及角色和用户对应关系如下图所示:②实现FilterInvocationSecurityMetadataSource类(1)List menus = menuService.getMenusWithRoles();这个是你自己的资源对应角色的查询方法。(2)重写的support方法都返回true@Configurationpublic class MyFilterInvocation implements FilterInvocationSecurityMetadataSource { @Autowired private MenuService menuService; AntPathMatcher antPathMatcher = new AntPathMatcher(); @Override public Collection getAttributes(Object object) throws IllegalArgumentException { String requestUrl = ((FilterInvocation) object).getRequestUrl(); List menus = menuService.getMenusWithRoles(); //- 遍历数据库的url,看请求路径是否与其匹配 for (Menu menu : menus) { //- 如果请求路径和数据库的路径匹配 if (antPathMatcher.match(menu.getUrl(),requestUrl)){ //- 访问该路径需要的角色 List roles = menu.getRoles(); String[] strs = new String[roles.size()]; for (int i = 0; i < roles.size(); i++) { strs[i] = roles.get(i).getName(); } return SecurityConfig.createList(strs); } } //- 如果请求路径和数据库的所有路径都不匹配,说明这个资源是登录后即可访问的 //- 用户登录即可访问,相当于在SecurityConfig中配置了.anyRequest().authenticated() return SecurityConfig.createList("ROLE_LOGIN"); } @Override public Collection getAllConfigAttributes() { return null; } @Override public boolean supports(Class> clazz) { return true; }}③实现AccessDecisionManager类重写的support方法都返回true@Configurationpublic class MyDecisionManager implements AccessDecisionManager { @Override public void decide(Authentication authentication, Object object, Collection configAttributes) throws AccessDeniedException, InsufficientAuthenticationException { for (ConfigAttribute configAttribute : configAttributes) { String needRole = configAttribute.getAttribute(); if ("ROLE_LOGIN".equals(needRole)) { //- 用户登录即可访问,相当于在SecurityConfig中配置了.anyRequest().authenticated() if (authentication instanceof AnonymousAuthenticationToken) { throw new AccessDeniedException("尚未登录,请先登录"); } else { return; } } Collection extends GrantedAuthority> authorities = authentication.getAuthorities(); //这里我写的是只要访问该资源的用户具有`访问该资源所需要角色`的其中一个即可 for (GrantedAuthority authority : authorities) { if (authority.getAuthority().equals(needRole)) { return; } } } throw new AccessDeniedException("权限不足,请联系管理员"); } @Override public boolean supports(ConfigAttribute attribute) { return true; } @Override public boolean supports(Class> clazz) { return true; }}④到SecurityConfig配置类中完成相应配置@Autowired private MyDecisionManager myDecisionManager; @Autowired private MyFilterInvocation myFilterInvocation; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .withObjectPostProcessor(new ObjectPostProcessor() { @Override public O postProcess(O object) { object.setAccessDecisionManager(myDecisionManager); object.setSecurityMetadataSource(myFilterInvocation); return object; } }); http.exceptionHandling().accessDeniedHandler(myAccessDeniedHandler()); } @Bean MyAccessDeniedHandler myAccessDeniedHandler(){ return new MyAccessDeniedHandler(); }⑤可选,实现AccessDeniedHandler类public class MyAccessDenied implements AccessDeniedHandler { @Override public void handle(HttpServletRequest req, HttpServletResponse resp, AccessDeniedException accessDeniedException) throws IOException, ServletException { resp.setContentType("application/json;charset=utf-8"); PrintWriter pw = resp.getWriter(); pw.write(new ObjectMapper().writeValueAsString(RespBean.error("权限不够,请联系管理员"))); pw.flush(); pw.close(); }}感谢你能够认真阅读完这篇文章,希望小编分享的"如何使用SpringSecurity实现动态加载权限信息"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习! 很赞哦! 角色 资源 路径 登录 权限 数据 数据库 用户 篇文章 配置 方法 信息 动态 管理员 管理 联系 不够 价值 兴趣 同时 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技工作委员会毛军 合肥互联网科技公司 猪兼强互联网科技 智慧科技互联网 善班互联网科技有限公司 广州紫鲸互联网科技 互联网科技生活的内容 深圳互联网科技怎么样 开启互联网科技时代小说 广州优美互联网科技 以后互联网后是啥科技 贵州叶脉互联网科技有限公司所属行业 苏州铭阳互联网科技有限公司 乌苏新华互联网科技做什么的 互联网科技人工智能实验室 互联网数据科技专业 工业互联网展湾科技股份有限公司 怎样加入科技互联网 互联网第三次科技革命特征 互联网领先科技成果宣传视频 天津市摩尔互联网科技 A股互联网金融科技公司 疫情对互联网科技公司影响 工业互联网科技新基建 互联网科技未来 互联网科技缩写 四个字互联网科技公司取名 宜昌元轩互联网科技有限公司 新氧科技和美国互联网有关系吗 易租星互联网科技有限公司 扫描关注千家信息网微信公众号,第一时间获取内容更新动态 转载请说明来源于"千家信息网" 本文地址:https://www.qianjiagd.com/a116987 上一篇 Linux的rmt命令有什么用 这篇文章主要讲解了"Linux的rmt命令有什么用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Linux的rmt命令有什么用"吧!Linux rmt 下一篇 html5头部内容通常包括什么内容 这篇文章主要介绍html5头部内容通常包括什么内容,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!html5头部内容通常包括:1、title标签定义的网页标题;2、Favicon 相关文章 PHP中session会话操作技巧有哪些 PHP类相关知识点有哪些 VS2008无法直接查看STL值怎么办 php版微信公众平台之微信网页登陆授权的示例分析 中高级PHP程序员应该掌握什么技术 CI框架出现mysql数据库连接资源无法释放怎么办 ajax跨域访问报错501怎么办 什么是RPC框架 .net mvc超过了最大请求长度怎么办 php分页原理的示例分析