工作流程
web.xml中配置了过滤器,整个访问请求都会被filter过滤
<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>
而过滤器shiroFilter
又有自己的过滤规则,具体配置在applicationContext.xml中,过滤器也是一个Bean,可以配置自己的规则。
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="loginUrl" value="/login.jsp"/>
<property name="successUrl" value="/list.jsp"/>
<property name="unauthorizedUrl" value="/unauthorized.jsp"/>
<!--
配置哪些页面需要受保护.
以及访问这些页面需要的权限.
1). anon 可以被匿名访问
2). authc 必须认证(即登录)后才可能访问的页面.
3). logout 登出.
4). roles 角色过滤器
-->
<property name="filterChainDefinitions">
<value>
/login.jsp = anon
# everything else requires authentication:
/** = authc
</value>
</property>
</bean>
流程图
图片来自尚硅谷Shiro视频:
过滤器bean的配置
(1)web.xml中DelegatingFilterProxy
的<filter-name>
的值需要与applecationContext.xml中的org.apache.shiro.spring.web.ShiroFilterFactoryBean
的id值相同,若不相同,则会抛出NoSuchBeanDefinitionException
异常,因为 Shiro会来IOC容器中查找和 <filter-name>
名字对应的filter bean
。
(2)也可以通过DelegatingFilterProxy的初始化参数targetBeanName
去指定bean的id。
如:
web.xml
<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>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>abc</param-value>
</init-param>
</filter>
applicationContext.xml:
<bean id="abc" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- ......... -->
</bean>
初始化参数的targetBeanName
值为abc
,bean的id也为abc
,这样也可以正常启动和加载。
拦截器URL配置细节
格式:url = 拦截器[参数],拦截器[参数]
如果当前请求的url匹配[urls]部分的某个url模式,将会执行其配置的拦截器。
anon(anonymous)拦截器表示匿名访问(即不需要登录即可访问)
authc(authentication)拦截器表示需要身份认证通过后才能访问。
匹配模式
url模式使用Ant风格模式,注意通配符匹配不包括目录分隔符"/"
:
- ?:匹配一个字符:如/admin?
,将会匹配/admin1
,但不会匹配/admin
(0个字符)或admin/
(目录分隔符)
- *:匹配0个或多个字符串:如/admin*
将匹配/admin /admin123
,但不匹配/admin/1
(目录分隔符和以后的字符)
- **:匹配路径中的0个或多个路径:如/admin/**
将匹配/admin/a /admin/a/b
注意:URL权限采取第一次匹配优先的方式,即从头开始使用第一个匹配的url模式对应的拦截器链
如:
/bb/** = filter1
/bb/aa = filter2
/** = filter3
若请求为/bb/aa
,则按照声明顺序进行匹配,将使用filter1进行拦截。