zoukankan      html  css  js  c++  java
  • Shiro-从数据表中初始化资源和权限

    我们在 applicationContext中配置受保护的资源和权限的关系

        <property name="filterChainDefinitions">
                <value>
                    /login.jsp= anon
                    /shiro/login= anon
                    /shiro/logout = logout
                    
                    /user.jsp = roles[user]
                    /admin.jsp = roles[admin]
                    
                    # everything else requires authentication:
                    
                    /** = authc
                </value>
            </property>

     这样配置有时候我们受保护的资源和权限特别多,我们希望将这些配置资源和权限信息放到数据库中,然后我们通过一个SQL 的方式取出来, 这种方式应该是最合适的。

      我们可以查看 配置中 filterChainDefinitions 的源码

    public void setFilterChainDefinitions(String definitions) {
            Ini ini = new Ini();
            ini.load(definitions);
            //did they explicitly state a 'urls' section?  Not necessary, but just in case:
            Ini.Section section = ini.getSection(IniFilterChainResolverFactory.URLS);
            if (CollectionUtils.isEmpty(section)) {
                //no urls section.  Since this _is_ a urls chain definition property, just assume the
                //default section contains only the definitions:
                section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
            }
            setFilterChainDefinitionMap(section);
        }
    1 public void setFilterChainDefinitionMap(Map<String, String> filterChainDefinitionMap) {
    2         this.filterChainDefinitionMap = filterChainDefinitionMap;
    3     }

    通过 debug的方式 可以看到在初始化时, filterChainDefinitionMap是一个LinkedHashMap,其内容就是我们在配置文件中配置的内容

     所以我们可以配置一个单独的bean filterChainDefinitionMap 作为ShiroFilterFactoryBean的属性。

     修改applicationContext.xml

    创建一个 bean

    package com.java.shiro.factory;
    
    import java.util.LinkedHashMap;
    
    public class FilterChainDefinitionMapBuilder {
    
        public LinkedHashMap<String, String> buildFilterChainDefinitionMap() {
            LinkedHashMap<String, String> map = new LinkedHashMap<>();
    
            // 在实际开发中访问数据表
    
        
         //这里必须是一个LinkedHashMap 保持顺序 map.put("/login.jsp", "anon"); map.put("/**", "authc"); return map; } }

      再次打断点查看 

  • 相关阅读:
    学习笔记9
    学习笔记8
    学习笔记7
    学习笔记6
    学习笔记5
    学习笔记4
    学习笔记3
    学习笔记2
    学习笔记1
    矩形覆盖
  • 原文地址:https://www.cnblogs.com/wq3435/p/6272087.html
Copyright © 2011-2022 走看看