天天看點

SSM整合Shiro架構這樣所有問題就完美解決啦, 對了,值得一提的是,用jar包導入的方式必須要寫ApplicationContext.xml而且要配置,但是部落客寫這個部落格的時候,maven方式也需要配置ApplicationContext.xml也是非常有意思的事情了,哈哈哈哈哈哈

什麼Shiro

Shiro是做安全驗證,權限管理,等…

是一種安全架構,屬于輕量級架構。。

導入依賴(導入jar包)

如果用的是maven來管理項目的話,我們需要在pom.xml檔案中加入依賴,

如果用的是動态的web工程,我們需要在lib檔案夾中導入jar包,然後Build Path --> Add to Build Path

  1. Spring相關依賴 ;
<dependency>
    		<groupId>org.springframework</groupId>
    		<artifactId>spring-context</artifactId>
    		<version>5.0.0.RELEASE</version>
		</dependency>
           
  1. SpringMVC相關依賴;
<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-web</artifactId>
		    <version>5.0.0.RELEASE</version>
		</dependency>
		
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-webmvc</artifactId>
		    <version>5.0.0.RELEASE</version>
		</dependency>
		
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>5.0.0.RELEASE</version>
		</dependency>
           
  1. MyBatis相關依賴;
<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.5</version>
		</dependency>
           
  1. Shiro相關依賴 ;
<dependency>
	    <groupId>org.apache.shiro</groupId>
	    <artifactId>shiro-all</artifactId>
	    <version>1.3.2</version>
	</dependency>
	
	<dependency>
	    <groupId>org.slf4j</groupId>
	    <artifactId>slf4j-api</artifactId>
	    <version>1.7.25</version>
	</dependency>
	
	<dependency>
	    <groupId>org.slf4j</groupId>
	    <artifactId>slf4j-log4j12</artifactId>
	    <version>1.7.25</version>
	</dependency>
           

5.Spring整合MyBatis依賴;

<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis-spring</artifactId>
		    <version>1.3.2</version>
		</dependency>
           
  1. 其他依賴(日志輸出,資料源,連接配接資料庫…) ;
<dependency>
   		<groupId>commons-logging</groupId>
   		<artifactId>commons-logging</artifactId>
    	<version>1.2</version>
	</dependency>
		
	<dependency>
	    <groupId>com.alibaba</groupId>
	    <artifactId>druid</artifactId>
	    <version>1.1.8</version>
	</dependency>
	
	<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.24</version>
	</dependency>
	
	<dependency>
		    <groupId>log4j</groupId>
		    <artifactId>log4j</artifactId>
		    <version>1.2.17</version>
	</dependency>
	
	<dependency>
		    <groupId>cglib</groupId>
		    <artifactId>cglib</artifactId>
		    <version>3.2.5</version>
	</dependency>
	
	<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-jdbc</artifactId>
		    <version>4.0.4.RELEASE</version>
	</dependency>
           

搭建SSM架構(項目概要)

SSM整合Shiro架構這樣所有問題就完美解決啦, 對了,值得一提的是,用jar包導入的方式必須要寫ApplicationContext.xml而且要配置,但是部落客寫這個部落格的時候,maven方式也需要配置ApplicationContext.xml也是非常有意思的事情了,哈哈哈哈哈哈

配置

以下配置是基于ssm架構基本配置之上

springmvc.xml

<!--  Shiro Core Components - Not Spring Specific -->
<!-- 安全管理器  -->

    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="cacheManager" ref="cacheManager"/>
        <property name="sessionMode" value="native"/>
        <property name="realm" ref="jdbcRealm"/>
    </bean>
    
    <!-- 緩存管理器 -->
    <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/>
    </bean>
	
	<!-- 自定義的Realm類 -->
   <bean id="jdbcRealm" class="com.zrhk.bean.ShiroRealm"></bean>
    
    
    
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

    <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>

    <bean id="secureRemoteInvocationExecutor" class="org.apache.shiro.spring.remoting.SecureRemoteInvocationExecutor">
        <property name="securityManager" ref="securityManager"/>
    </bean>

<!-- Shiro的過濾器,過濾所有請求 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/>
        <property name="loginUrl" value="/index.jsp"/>				--->登入界面
        <property name="successUrl" value="/success.jsp"/>			--->成功界面
        <property name="unauthorizedUrl" value="/error.jsp"/>		--->錯誤界面
        
        <property name="filterChainDefinitions">
            <value>
                /index.jsp = anon		--->未經過認證傳回該界面
                /** = authc		--->經過認證傳回界面
            </value>
        </property>
    </bean>
           

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>
    </filter>

    <filter-mapping>
        <filter-name>shiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
           

實作

SSM整合Shiro架構這樣所有問題就完美解決啦, 對了,值得一提的是,用jar包導入的方式必須要寫ApplicationContext.xml而且要配置,但是部落客寫這個部落格的時候,maven方式也需要配置ApplicationContext.xml也是非常有意思的事情了,哈哈哈哈哈哈

當在url字尾改成其他url時,會因為xml的配置因為沒有認證跳轉回本界面。

SSM整合Shiro架構這樣所有問題就完美解決啦, 對了,值得一提的是,用jar包導入的方式必須要寫ApplicationContext.xml而且要配置,但是部落客寫這個部落格的時候,maven方式也需要配置ApplicationContext.xml也是非常有意思的事情了,哈哈哈哈哈哈

注意事項

1.運作時可能出現 :No WebApplicationContext found: no ContextLoaderListener or DispatcherServlet registered?

解決辦法:

ApplicationContext.xml

<!-- 
         Shiro Core Components - Not Spring Specific
    -->
    
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="cacheManager" ref="cacheManager"/>
        <property name="sessionMode" value="native"/>
        <property name="realm" ref="jdbcRealm"/>
    </bean>

    <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/>
    </bean>

   <bean id="jdbcRealm" class="com.zrhk.bean.ShiroRealm"></bean>
    
    
    

    <!-- =========================================================
         Shiro Spring-specific integration
         ========================================================= -->
    <!-- Post processor that automatically invokes init() and destroy() methods
         for Spring-configured Shiro objects so you don't have to
         1) specify an init-method and destroy-method attributes for every bean
            definition and
         2) even know which Shiro objects require these methods to be
            called. -->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

    <!-- Enable Shiro Annotations for Spring-configured beans.  Only run after
         the lifecycleBeanProcessor has run: -->
    <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>

    <!-- Secure Spring remoting:  Ensure any Spring Remoting method invocations can be associated
         with a Subject for security checks. -->
    <bean id="secureRemoteInvocationExecutor" class="org.apache.shiro.spring.remoting.SecureRemoteInvocationExecutor">
        <property name="securityManager" ref="securityManager"/>
    </bean>

    <!-- Define the Shiro Filter here (as a FactoryBean) instead of directly in web.xml -
         web.xml uses the DelegatingFilterProxy to access this bean.  This allows us
         to wire things with more control as well utilize nice Spring things such as
         PropertiesPlaceholderConfigurer and abstract beans or anything else we might need: -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/>
        <property name="loginUrl" value="/index.jsp"/>
        <property name="successUrl" value="/success.jsp"/>
        <property name="unauthorizedUrl" value="/error.jsp"/>
        
        <property name="filterChainDefinitions">
            <value>
                /index.jsp = anon
                /** = authc
            </value>
        </property>
    </bean>
           

并且在web.xml檔案中加入

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:ApplicationContext.xml</param-value>
	</context-param>
           

這樣所有問題就完美解決啦, 對了,值得一提的是,用jar包導入的方式必須要寫ApplicationContext.xml而且要配置,但是部落客寫這個部落格的時候,maven方式也需要配置ApplicationContext.xml也是非常有意思的事情了,哈哈哈哈哈哈

繼續閱讀