shiro安全控制目录
1. 过滤器链的配置
Shiro作为一个安全框架,首先他需要有一个核心的Filter拦截所有请求。
而要在Spring中使用Shiro的话,可以在web.xml中配置一个DelegatingFilterProxy
,DelegatingFilterProxy作用便是自动的去Spring容器中查找名字为shiroFilter(filter-name)的bean,并将所有的Filter操作委托给他。
web.xml的配置:
<!--拦截器由spring容器管理-->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Spring管理的ShiroFilter:
<!-- Shiro主过滤器本身功能十分强大,其强大之处就在于它支持任何基于URL路径表达式的、自定义的过滤器的执行 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!--shiro的核心安全接口,这是属性是必须的-->
<property name="securityManager" ref="securityManager"/>
<!-- 要求登录时的链接,非必须的属性,默认会自动寻找Web工程根目录下的"/login.jsp"页面 -->
<property name="loginUrl" value="/login/init"></property>
<!-- 用户访问未对其授权的资源时,所显示的连接 -->
<property name="unauthorizedUrl" value="/pages/error/403.jsp"/>
<!--定义过滤器链-->
<property name="filterChainDefinitions">
<value>
<!--Shiro过滤器链的配置-->
/login/init/** = anon <!-- 对于登录相关不进行鉴权 -->
/login/login/** = anon <!-- 对于登录相关不进行鉴权 -->
/static/** = anon <!-- 静态资源不进行鉴权 -->
/** = user
</value>
</property>
<property name="filters">
<map>
<entry key="user" value-ref="userFilter"></entry>
</map>
</property>
</bean>
<!--自定义拦截器-->
<bean id="userFilter" class="com.springmvc.common.filter.SystemUserFilter"/>
当浏览器发出一个请求后,按照web.xml中配置的Filter链的顺序进行拦截,当执行到ShiroFilter过滤器时,会先执行Shiro中定义的Filter链,然后在执行web.xml中配置的Filter链。
2. SecurityManager的配置
SecurityManager在Shiro中地位就像一位“安全大管家”,其作用类似于SpringMVC中的DispatcherServlet
,是Shiro中的心脏,用于协调和管理所有的Subject、且负责认证、授权、及会话、缓存的管理。
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!--Single realm app. If you have multiple realms, use the 'realms' property instead.-->
<property name="realm" ref="myRealm"/>
<property name="sessionMode" value="http"/>
<property name="rememberMeManager" ref="rememberMeManager"/>
<!-- 需要实现org.apache.shiro.cache.CacheManager接口-->
<property name="cacheManager" ref="customShiroCacheManager"/>
<!-- sessionManager -->
<property name="sessionManager" ref="defaultWebSessionManager"/>
</bean>
SecurityManager中的组件高度模块化,即将所有的行为授权给内部包装好/自定义的组件完成,例如负责认证授权的Realm组件、Session管理的SessionManager组件、缓存相关的CacheManager组件。
负责认证授权的类:
<bean id="myRealm" class="com.springmvc.common.shiro.UserAuthorizingRealm"></bean>
SessionManager类:
<bean id="defaultWebSessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!--全局session过期时间:30分钟操作会覆盖web.xml文件中的超时时间配置 -->
<property name="globalSessionTimeout" value="1800000"/>
<!---该类继承于org.apache.shiro.session.mgt.eis.AbstractSessionDAO,完成数据源处理session操作-->
<property name="sessionDAO" ref="customShiroSessionDAO"/>
<!-- 所有的session一定要将id设置到Cookie之中,需要提供有Cookie的操作模版 -->
<property name="sessionIdCookie" ref="simpleCookie"/>
<!--定时扫描超时session-->
<!-- session 监听,可以多个。 -->
<property name="sessionListeners">
<list>
<!--监听类需要实现org.apache.shiro.session.SessionListener接口-->
<ref bean="customSessionListener"/>
</list>
</property>
<!--session关闭调度器-->
<property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
<!-- 需要让此session可以使用该定时调度器进行检测 -->
<property name="sessionValidationSchedulerEnabled" value="true"/>
<!--删除过期的session-->
<property name="deleteInvalidSessions" value="true"/>
</bean>
<bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg index="0" value="JSESSIONID_COOKIE"/>
<property name="httpOnly" value="true"/>
</bean>
<bean id="sessionValidationScheduler"
class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">
<property name="sessionManager" ref="defaultWebSessionManager"/>
</bean>
3. Realm的配置
继承AuthorizingRealm
类,重写认证授权方法。
推荐阅读
https://blog.csdn.net/u012345283/article/details/44199791#commentBox