您的位置:首页 > 其它

Shiro-从数据表中初始化资源和权限

2017-01-11 01:05 155 查看
我们在 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;
}

}


  再次打断点查看

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: