<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- Shiro的核心安全接口,这个属性是必须的 --> <property name="securityManager" ref="securityManager"></property> <!-- 未认证,要跳转的url,非必须的属性,默认会自动寻找Web工程根目录下的"/login.jsp"页面 --> <property name="loginUrl" value="/loginPage"></property> <!-- 未授权,要跳转的url --> <property name="unauthorizedUrl" value="/unauthorizedPage"></property> <property name="filterChainDefinitions"> <!-- anon:可以匿名访问 authc:必须认证登录后才能访问 --> <value> /loginPage=anon /doLogin=anon /doLogout=anon /page1 = roles[role1] /page2 = roles[role2] /*=authc </value> </property> </bean>
以上filterChainDefinitions是纯手工配置,但实际应从数据库读取
新建一个FilterChainDefinitionMapBuilder
public class FilterChainDefinitionMapBuilder { public LinkedHashMap<String, String> buildFilterChainDefinitionMap(){ LinkedHashMap<String, String> map = new LinkedHashMap<>(); //从数据库读取省略... map.put("/loginPage", "anon"); map.put("/doLogin", "anon"); map.put("/doLogout", "anon"); map.put("/page1", "roles[role1]"); map.put("/page2", "roles[role2]"); map.put("/**", "authc"); return map; } }
xml修改如下
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- Shiro的核心安全接口,这个属性是必须的 --> <property name="securityManager" ref="securityManager"></property> <!-- 未认证,要跳转的url,非必须的属性,默认会自动寻找Web工程根目录下的"/login.jsp"页面 --> <property name="loginUrl" value="/loginPage"></property> <!-- 未授权,要跳转的url --> <property name="unauthorizedUrl" value="/unauthorizedPage"></property> <property name="filterChainDefinitionMap" ref="filterChainDefinitionMap"></property> </bean>
<!-- 配置一个 bean, 该 bean 实际上是一个 Map. 通过实例工厂方法的方式 -->
<bean id="filterChainDefinitionMap" factory-bean="filterChainDefinitionMapBuilder" factory-method="buildFilterChainDefinitionMap"></bean> <bean id="filterChainDefinitionMapBuilder" class="com.zns.shiro.FilterChainDefinitionMapBuilder"></bean>