千家信息网

如何使用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 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股互联网金融科技公司 疫情对互联网科技公司影响 工业互联网科技新基建 互联网科技未来 互联网科技缩写 四个字互联网科技公司取名 宜昌元轩互联网科技有限公司 新氧科技和美国互联网有关系吗 易租星互联网科技有限公司
0