功能
拦截Web服务器接受的请求
Shiro-Filter结构设计
Shiro-Filter使用关键点
- org.springframework.web.filter.DelegatingFilterProxy
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<!-- 是否进行下一个过滤链,默认false -->
<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就是一个对于servlet filter的代理,用这个类的好处是通过设置targetFilterLifecycle参数为true,使spring容器来管理servlet filter的生命周期。
通过filter-name来查找Spring容器中同名的Bean,将请求转发给该bean
- org.apache.shiro.spring.web.ShiroFilterFactoryBean
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" />
<property name="loginUrl" value="/login.do" />
<property name="successUrl" value="/welcome.do" />
<!-- 自定义shiro的Filter -->
<property name="filters">
<map>
<entry key="loginFilter" value-ref="loginFilter"></entry>
</map>
</property>
<!--基本系统级别权限配置-->
<property name="filterChainDefinitions" >
<value>
/goods/list.do = loginFilter, user
//路径中使用**,全匹配
/static/** = anno
/admin/** = anon
</value>
</property>
</bean>
采用委派模式,即将实际的处理指定给其他的Filter
ShiroFilterFactoryBean得到DelegatingFilterProxy转发的请求,根据路径在filterChainDefinitions集合中匹配,匹配到第一个适合的,将请求委派给指定的Filter
- filterChainDefinitions
anon---------------org.apache.shiro.web.filter.authc.AnonymousFilter 没有参数,表示可以匿名使用。
authc--------------org.apache.shiro.web.filter.authc.FormAuthenticationFilter 表示需要认证(登录)才能使用,没有参数
authcBasic---------org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter 没有参数表示httpBasic认证
logout-------------org.apache.shiro.web.filter.authc.LogoutFilter
noSessionCreation--org.apache.shiro.web.filter.session.NoSessionCreationFilter
port---------------org.apache.shiro.web.filter.authz.PortFilter port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString是你访问的url里的?后面的参数。
rest---------------org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter 根据请求的方法,相当于/admins/user/ * * =perms[user:method] ,其中method为post,get,delete等。
roles--------------org.apache.shiro.web.filter.authz.RolesAuthorizationFilter 参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/ **=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。
ssl----------------org.apache.shiro.web.filter.authz.SslFilter 没有参数,表示安全的url请求,协议为https
user---------------org.apache.shiro.web.filter.authz.UserFilter 没有参数,表示必须存在用户,当登入操作时不做检查
perms--------------org.apache.shiro.web.filter.authz.PermissionAuthorizationFilter 参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/ **=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。