导航: 首页 > 开发技术 > 如何使用SpringSecurity实现动态加载权限信息 发表于:2025-11-11 作者:千家信息网编辑 千家信息网最后更新 2025年11月11日,这篇文章主要介绍了如何使用SpringSecurity实现动态加载权限信息,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。①数据库中资源 千家信息网最后更新 2025年11月11日如何使用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安全错误 数据库的锁怎样保障安全 动态页面导入表格数据库 聊城定制软件开发解决方案 数据库的cpu占用 是否允许使用移动数据库 幼儿园网络安全活动简报 云服务器下载量挣钱 普通pc做内网服务器 数据库管理系统 代码 测量管理体系数据库 数据库添加更新删除 奉贤区项目数据库服务有哪些 笔记本很多游戏无法连接服务器 oracle制作数据库账号 nc57查询数据库 手机登录服务器方法 国密数据库 董事会持股比例哪个数据库查 衡水网络技术服务价格 金华物流软件开发流程八个步骤 区块链行业网络安全等级 纯软件开发如何看懂原理图 网络安全 暗网 学计算机网络技术能当老师吗 我的世界2b2t服务器最新 黑暗之魂3服务器断开怎么解决 处理网络安全方面的问题 手机网络安全动画 苹果软件开发公司排名 网络安全十大领域 数据库关系模式设计 扫描关注千家信息网微信公众号,第一时间获取内容更新动态 转载请说明来源于"千家信息网" 本文地址: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分页原理的示例分析