shiro与ssm的整合

1、首先在WEB-INF/web,xml中配置过滤器

DelegatingFilterProxy 作用是自动到 Spring 容器查找名字为 shiroFilter(filter-name) 的 bean 并把所有 Filter 的操作委托给它。

targetFilterLifecycle:指明作用于filter的所有生命周期。

如果设置"targetFilterLifecycle"为True,则spring来管理Filter.init()和Filter.destroy();若为false,则这两个方法失效!!

在Spring中配置的bean的name要和web.xml中的<filter-name>一样.

<filter>

<filter-name>shiroFilter</filter-name>

<filterclass>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>shiroFilter</param-value>-->

<!--</init-param>-->

</filter>

 

<filter-mapping>

<filter-name>shiroFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

 

2、在spring配置文件中配置3个bean对象

(1)shiro过滤器:对应上面web.xml中配置的过滤器,为了方便对各个请求认证策略的设置,可以自己实现ShiroFilterFactoryBean,在其中定义方法通过setfilterChainDefinitions方法设置认证策略,由于认证策略的处理流程是有序的自上而下,所有需要将请求地址和对象的策略封装到LinkedHashMap中。最后在配置文件中添加init-method属性,将自定义类中设置方法设置为初始化方法,使ShiroFilterFactoryBean在初始化的执行。

(2)realm:可以有 1 个或多个 Realm,可以认为是安全实体数据源,即用于获取安全实体 的;可以是JDBC 实现,也可以是内存实现等等;由用户提供;所以一般在应用中都需要实现自己的Realm;

realm的继承关系图

shiro与ssm的整合

从上图我们来看我们一般继承AuthorizingRealm(授权)即可,其继承了AuthenticatingRealm(认证),而且间接继承了CachingRealm(缓存)

 

(3)securityManager:相当于SpringMVC 中的 DispatcherServlet;是 Shiro 的心脏; 所有具体的交互都通过 SecurityManager 进行控制;它管理着所有 Subject、且负责进行、认证、授权、会话及缓存的管理。

DefaultWebSecurityManager的类关系结构图

shiro与ssm的整合

从上图我们可以看出来,DefaultWebSecurityManager是最底层的实现类,而且其中的构造方法是层层调用的,上面实现的类,分别有数据源管理,缓存管理,认证管理,授权管理,会话管理等,我们可以对shiro的设置进行各种设置。

 

<bean id="shiroFilter" class="com.qianfeng.shiro.MyShiroFilterFactoryBean" init-method="init">

<property name="securityManager" ref="securityManager"/>

<!--

如果当前用户没有登录就跳转到这个页面行登录

-->

<property name="loginUrl" value="/login.html"/>

<!--

登录成功后的页面

-->

<property name="successUrl" value="/success.html"/>

<!--

没有授权的提示页面

-->

<property name="unauthorizedUrl" value="/unauthorized.html"/>

<!-- The 'filters' property is not necessary since any declared javax.servlet.Filter bean

defined will be automatically acquired and available via its beanName in chain

definitions, but you can perform overrides or parent/child consolidated configuration

here if you like: -->

<!-- <property name="filters">

<util:map>

<entry key="aName" value-ref="someFilterPojo"/>

</util:map>

</property> -->

<!--<property name="filterChainDefinitions">-->

<!--<value>-->

<!--/favicon.ico = anon-->

<!--/logo.png = anon-->

<!--/shiro.css = anon-->

<!--/index.html = anon-->

<!--/login.html= anon-->

<!--/abc.html = authc-->

<!--# allow WebStart to pull the jars for the swing app:-->

<!--/*.jar = anon-->

<!--# everything else requires authentication:-->

<!--/loginuser.action = anon-->

<!--/user/loginxiaomi.action = anon-->

<!--/xiaoqu.html = perms[fdsfwerdfss]-->

<!--/** = authc-->

<!--</value>-->

<!--</property>-->

</bean>

 

<bean id="xiaomiRealm" class="com.qianfeng.shiro.realm.XiaomiRealm2">

<property name="credentialsMatcher">

<bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">

<property name="hashAlgorithmName" value="MD5"/>

<property name="hashIterations" value="1024"/>

</bean>

</property>

</bean>

 

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

<!--<property name="realm" ref="myrealm"/>-->

<property name="realm" ref="xiaomiRealm"/>

</bean>

 

3、注解配置

如果使用注解声明权限的方式,需要将一下三个Bean放到springmvc的配置文件中,否则注解权限无效

bean后处理器自动调用init方法和distory方法

<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

 

 

depends-on属性:两个bean对象没有很强的依赖关系,但是在逻辑关系上一个对象在另一个对象之前初始化,这时可以设置这个属性

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"

depends-on="lifecycleBeanPostProcessor"/>

 

<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">

<property name="securityManager" ref="securityManager"/>

</bean>