Shiro集成Spring時web.xml中配置詳解
1、web.xml
中的 shiroFilter
-
Shiro提供了與Web 集成的支持,其通過一個ShiroFilter入口來攔截需要安全控制的URL,然後進行相應的控制
-
ShiroFilter類似於如Strut2/SpringMVC這種web 框架的前端控制器,是安全控制的入口點,其負責讀取配置(如ini配置文件),然後判斷URL 是否需要登錄/權限等工作。
<!-- filter-name匹配Spring 的配置文件:applicationContext.xml中的“shiroFilter”bean的名稱 -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
DelegatingFilterProxy
作用是自動到 Spring 容器查找名字爲 shiroFilter
(filter-name中的名字)的bean
並把所有Filter的操作委託給它。然後將ShiroFilter
配置到spring容器即可:
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<!—忽略其他,詳見與Spring 集成部分-->
</bean>
shiroFilter配置注意:
- DelegatingFilterProxy 實際上是 Filter 的一個代理對象. 默認情況下, Spring 會到 IOC 容器中查找和
<filter-name>
對應的 filter bean。也可以通過 ·targetBeanName· 的初始化參數來配置 filter bean 的 id。 Sping.xml
配置文件中id 必須和 web.xml 文件中配置的 DelegatingFilterProxy 的<filter-name>
一致.
若不一致, 則會拋出:NoSuchBeanDefinitionException
。 因爲 Shiro 會來 IOC 容器中查找和<filter-name>
名字對應的 filter bean.
Shiro集成 Web 時 web.xml
中配置詳解
1、web.xml
中的 shiroFilter
- Shiro 1.2及以後版本的配置方式
從 Shiro 1.2 開始引入了Environment/WebEnvironment
的概念,即由它們的實現提供相應的SecurityManager
及其相應的依賴。ShiroFilter會自動找到Environment
然後獲取相應的依賴。
<!--
從Shiro 1.2開始引入了Environment/WebEnvironment的概念,即由它們的實現提供相應的SecurityManager及其相應的依賴。
ShiroFilter會自動找到Environment然後獲取相應的依賴。
底層:返回反射創建shiroEnvironmentClass對象,調用其init方法.
shiroEnvironmentClass中的init方法創建SecurityManager實例並綁定到當前運行環境
-->
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<!-- 攔截所有的請求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
通 過EnvironmentLoaderListener
來創建相應的WebEnvironment
, 並自動綁定到
ServletContext
,默認使用IniWebEnvironment
實現。
可以通過如下配置修改默認實現及其加載的配置文件位置:
<!--初始化securityManager對象所需要的環境配置-->
<context-param>
<param-name>shiroEnvironmentClass</param-name>
<param-value>org.apache.shiro.web.env.IniWebEnvironment</param-value>
</context-param>
<context-param>
<param-name>shiroConfigLocations</param-name>
<param-value>classpath:shiro.ini</param-value>
</context-param>
shiroConfigLocations
默認是“/WEB-INF/shiro.ini
”,IniWebEnvironment
默認是先從
/WEB-INF/shiro.ini
加載,如果沒有就默認加載classpath:shiro.ini。