我們在 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; } }
再次打斷點查看