导航: 首页 > 开发技术 > 如何使用SpringSecurity实现动态加载权限信息 发表于:2025-01-19 作者:千家信息网编辑 千家信息网最后更新 2025年01月19日,这篇文章主要介绍了如何使用SpringSecurity实现动态加载权限信息,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。①数据库中资源 千家信息网最后更新 2025年01月19日如何使用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安全错误 数据库的锁怎样保障安全 小梦哥服务器教程 挖财网络技术有限公司规模多大 旧电脑变成一体服务器 系统管理员可以更改服务器名称 数据库太大了影响备份时间 河北正规网络技术分类代理商 玫瑰互动网络技术 魔兽世界最新的服务器 sql数据库新增用户密码 软件开发部门经理管理办法 荣耀v9需要登录服务器吗 晨星公司软件开发怎么样 电脑分屏服务器断开连接 想要学习网络技术去哪里 网络安全股估值 盗版只狼登不上服务器 c 和数据库连接 搞软件开发工作心得简短一句话 上海示普网络技术有限公司 北京星网锐捷网络技术创始人 常熟提供网络技术哪家好 网络安全感知 java 魔兽找不到的服务器角色 线上宣传网络安全简报 学网络技术吃香吗 软件开发 需求文档 杭州边锋网络技术有限公司招 安徽现代软件开发包括哪些 华为很少宣传网络安全 西安网络安全周主题 扫描关注千家信息网微信公众号,第一时间获取内容更新动态 转载请说明来源于"千家信息网" 本文地址: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分页原理的示例分析