美文网首页shiro
三、集成Spring

三、集成Spring

作者: 好像身体被掏空 | 来源:发表于2018-05-22 11:48 被阅读3次

    项目配置

    项目结构图

    pom.xml 需要导入的内容:
    Spring和Shiro的依赖(*略)
    web.xml 配置文件:

    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
      <!-- 加载spring容器 -->
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
      </context-param>
    
      <!-- The filter-name matches name of a 'shiroFilter' bean inside applicationContext.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>
      </filter>
      <filter-mapping>
        <filter-name>shiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
    
      <!-- springmvc的前端控制器 -->
      <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- contextConfigLocation不是必须的, 如果不配置contextConfigLocation, springmvc的配置文件默认在:WEB-INF/servlet的name+"-servlet.xml" -->
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    </web-app>
    
    

    applicationContext.xml 配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!-- 1.配置SecurityManager -->
        <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
            <property name="cacheManager" ref="cacheManager" />
            <property name="realm" ref="shiroRealm" />
        </bean>
    
        <!--2.配置CacheManager
            2.1 需要引入ehcache的jar及配置文件
        -->
        <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
            <property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/>
        </bean>
    
        <!--3.配置realm
            3.1 直接实现了Realm接口的bean
        -->
        <bean id="shiroRealm" class="org.keyhua.shiro.ShiroRealm">
    
        </bean>
    
        <!--4.配置LifecycleBeanPostProcessor.可以自定义调用配置在Spring IOC 容器中shiro bean的生命周期方法-->
        <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"></bean>
    
        <!--5.启用IOC容器中使用shiro的注解,但必须在配置了LifecycleBeanPostProcessor之后才能使用 -->
        <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
              depends-on="lifecycleBeanPostProcessor">
        </bean>
        <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
            <property name="securityManager" ref="securityManager"/>
        </bean>
    
    
        <!--6.配置shiroFilter
            6.1 id必须和web.xml文件中配置的DelegatingFilterProxy的<filter-name>一致;  
                若不一致,则会抛出:NoSuchBeanDefinitionException异常。因为Shiro会来IOC容器中查找
            6.2 
        -->
        <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" />
            <!--配置哪些页面需要受保护,以及访问这些页面需要的权限
                a. anon 可以被匿名访问
                b. authc 必须认证(登录)后才可以访问的页面
            -->
            <property name="filterChainDefinitions">
                <value>
                    /login.jsp = anon
                    /** = authc
                </value>
            </property>
        </bean>
    
    </beans>
    

    springmvc.xml 配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                               http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                               http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <context:component-scan base-package="org.keyhua.shiro"></context:component-scan>
    
        <mvc:annotation-driven/>
    
        <mvc:default-servlet-handler/>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
    </beans>
    
    

    解析:

    启动项目,当访问需要认证的页面时,会自动跳转到登录页面。

    与Web集成

        Shiro提供了与Web集成的支持,其通过一个ShiroFilter入口来拦截需要安全控制的URL,然后进行相应的控制;
        ShiroFilter 类似于Struts2/SpringMVC这种web框架的前端控制器,是安全控制的入口,其负责读取配置(如ini配置文件),然后判断URL是否需要认证/授权等工作。

    ShiroFilter 的工作原理
    • 调试DelegatingFilterProxy

    DelegatingFilterProxy实际上是Filter的一个代理对象。默认情况下,Spring回到IOC容器中查找和<filter-name>对应的filter bean;也可以通过targetBeanName的初始化参数(使用init-param配置)来配置filter bean的id。

    filterChainDefinitions URL配置细节
    • [urls]部分的配置,其格式是:"url=拦截器[参数],拦截器[参数]";
    • 如果当前请求的url匹配[urls]部分的某个url模式,将会执行其匹配的拦截器;
    • anon(anonymous)拦截器表示匿名访问(即不需要登录即可访问);
    • authc(authentication)拦截器表示需要身份认证通过后才能访问。
    • URL匹配模式:
      1. url模式使用Ant风格模式
      2. Ant路径通配符支持 ?、*,注意通配符匹配不包括目录分隔符"/":
        • ?:匹配一个字符,如/admin?将匹配/admin1、但不匹配/admin、/admin/;
        • *:匹配0个或多个字符串,如/admin*将匹配/admin、/admin123、但不匹配/admin/1;
        • **:匹配路径中的0个或多个路径,如/admin/**将匹配/admin/a、/admin/a/b;
    • URL匹配顺序:
      1. URL权限采取第一次匹配优先的方式,即从头开始试用第一个匹配的url模式对应的拦截器链;
      2. 如:
        • /bb/**=filter1
        • /bb/aa=filter2
        • /**=filter3
        • 如果请求的url是"bb/aa",应为按照声明的顺序进行匹配,那么将试用filter1进行拦截

    相关文章

      网友评论

        本文标题:三、集成Spring

        本文链接:https://www.haomeiwen.com/subject/skqqdftx.html