shiro在springmvc裏面的集成使用【轉】

  1. <dependency>  

  2.          <groupId>commons-collections</groupId>  

  3.          <artifactId>commons-collections</artifactId>  

  4.          <version>3.2.1</version>  

  5.      </dependency>  

  6.   

  7.      <dependency>  

  8.          <groupId>net.sf.ehcache</groupId>  

  9.          <artifactId>ehcache-core</artifactId>  

  10.          <version>2.6.9</version>  

  11.      </dependency>  

  12.   

  13.      <dependency>  

  14.          <groupId>org.apache.shiro</groupId>  

  15.          <artifactId>shiro-spring</artifactId>  

  16.          <version>1.2.3</version>  

  17.      </dependency>  

  18.   

  19.      <dependency>  

  20.          <groupId>org.apache.shiro</groupId>  

  21.          <artifactId>shiro-ehcache</artifactId>  

  22.          <version>1.2.3</version>  

  23.      </dependency>  

  24.   

  25.      <dependency>  

  26.          <groupId>org.apache.shiro</groupId>  

  27.          <artifactId>shiro-quartz</artifactId>  

  28.          <version>1.2.3</version>  

  29.      </dependency>  

 

如果項目是hibernate的,以前的時候ehcache可能不是單例的,因爲shiro裏面也使用到了ehcache做緩存,和hibernate的ehcache緩存配置有衝突,所以需要對hibernate的ehcache部分做些調整,調整如下:

 

Xml代碼  收藏代碼

  1. <bean id="sessionFactory"  

  2.          class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  

  3.        <property name="dataSource" ref="dataSource"></property>  

  4.        <property name="hibernateProperties">  

  5.            <props>  

  6.                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>  

  7.                <prop key="hibernate.show_sql">true</prop>  

  8.                <prop key="hibernate.hbm2ddl.auto">update</prop>  

  9.                <!-- 

  10.                <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</prop> 

  11.                -->  

  12.                <prop key="hibernate.cache.region.factory_class">  

  13.                    org.hibernate.cache.SingletonEhCacheRegionFactory  

  14.                </prop>  

  15.                <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</prop>  

  16.                <prop key="hibernate.cache.use_second_level_cache">true</prop>  

  17.                <prop key="hibernate.cache.use_query_cache">true</prop>  

  18.                <prop key="hibernate.cache.use_structured_entries">true</prop>  

  19.                <prop key="hibernate.cache.provider_configuration_file_resource_path">WEB-INF/classes/ehcache.xml</prop>  

  20.                <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>  

  21.            </props>  

  22.        </property>  

  23.        <property name="packagesToScan">  

  24.            <list>  

  25.                <value>com.xxx.entity</value>  

  26.            </list>  

  27.        </property>  

  28.    </bean>  

 

上面紅色的文字部分是需要調整的內容。

 

 

既然用到了ehcache,ehcahce.xml文件裏面的配置內容如下:

 

Xml代碼  收藏代碼

  1. <?xml version="1.0" encoding="UTF-8"?>  

  2. <ehcache>  

  3.     <diskStore path="java.io.tmpdir" />  

  4.   

  5.     <defaultCache maxElementsInMemory="10000" eternal="false"  

  6.                   timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />  

  7.     <cache name="org.hibernate.cache.UpdateTimestampsCache"  

  8.            maxElementsInMemory="5000" eternal="true" overflowToDisk="true" />  

  9.     <cache name="org.hibernate.cache.StandardQueryCache"  

  10.            maxElementsInMemory="10000" eternal="false" timeToLiveSeconds="120"  

  11.            overflowToDisk="true" />  

  12.     <!-- 登錄記錄緩存 鎖定10分鐘 -->  

  13.     <cache name="passwordRetryCache"  

  14.            maxEntriesLocalHeap="2000"  

  15.            eternal="false"  

  16.            timeToIdleSeconds="3600"  

  17.            timeToLiveSeconds="0"  

  18.            overflowToDisk="false"  

  19.            statistics="true">  

  20.     </cache>  

  21.   

  22.     <cache name="authorizationCache"  

  23.            maxEntriesLocalHeap="2000"  

  24.            eternal="false"  

  25.            timeToIdleSeconds="3600"  

  26.            timeToLiveSeconds="0"  

  27.            overflowToDisk="false"  

  28.            statistics="true">  

  29.     </cache>  

  30.   

  31.     <cache name="authenticationCache"  

  32.            maxEntriesLocalHeap="2000"  

  33.            eternal="false"  

  34.            timeToIdleSeconds="3600"  

  35.            timeToLiveSeconds="0"  

  36.            overflowToDisk="false"  

  37.            statistics="true">  

  38.     </cache>  

  39.   

  40.     <cache name="shiro-activeSessionCache"  

  41.            maxEntriesLocalHeap="2000"  

  42.            eternal="false"  

  43.            timeToIdleSeconds="3600"  

  44.            timeToLiveSeconds="0"  

  45.            overflowToDisk="false"  

  46.            statistics="true">  

  47.     </cache>  

  48. </ehcache>  

 

 

然後是web.xml文件裏面加過濾器,注意要寫在springmvc的filter前面

 

Xml代碼  收藏代碼

  1. <!-- shiro 安全過濾器 -->  

  2. <!-- The filter-name matches name of a 'shiroFilter' bean inside applicationContext.xml -->  

  3. <filter>  

  4.     <filter-name>shiroFilter</filter-name>  

  5.     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  

  6.     <async-supported>true</async-supported>  

  7.     <init-param>  

  8.         <param-name>targetFilterLifecycle</param-name>  

  9.         <param-value>true</param-value>  

  10.     </init-param>  

  11. </filter>  

  12.   

  13. <!-- Make sure any request you want accessible to Shiro is filtered. /* catches all -->  

  14. <!-- requests.  Usually this filter mapping is defined first (before all others) to -->  

  15. <!-- ensure that Shiro works in subsequent filters in the filter chain:             -->  

  16. <filter-mapping>  

  17.     <filter-name>shiroFilter</filter-name>  

  18.     <url-pattern>/*</url-pattern>  

  19. </filter-mapping>  

 

 

然後就是shiro相關的spring配置參數文件了

Xml代碼  收藏代碼

  1. <?xml version="1.0" encoding="UTF-8"?>  

  2. <beans xmlns="http://www.springframework.org/schema/beans"  

  3.        xmlns:util="http://www.springframework.org/schema/util"  

  4.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

  5.        xsi:schemaLocation="  

  6.        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  

  7.        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">  

  8.   

  9.     <!-- 緩存管理器 使用Ehcache實現-->  

  10.     <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">  

  11.         <property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/>  

  12.     </bean>  

  13.   

  14.     <bean id="passwordHelper" class="com.shinowit.framework.security.PasswordHelper">  

  15.     </bean>  

  16.   

  17.     <!-- 憑證匹配器 -->  

  18.     <bean id="credentialsMatcher"  

  19.           class="com.shinowit.framework.security.credentials.RetryLimitSimpleCredentialsMatcher">  

  20.         <constructor-arg ref="cacheManager"/>  

  21.         <property name="passwordHelper" ref="passwordHelper"/>  

  22.     </bean>  

  23.   

  24.   

  25.     <bean id="shiro_user_dao" class="com.shinowit.framework.security.dao.UserDAO">  

  26.         <property name="jt" ref="jdbcTemplate"/>  

  27.     </bean>  

  28.   

  29.     <!-- Realm實現 -->  

  30.     <bean id="userRealm" class="com.shinowit.framework.security.realm.UserRealm">  

  31.         <property name="userDAO" ref="shiro_user_dao"/>  

  32.         <property name="credentialsMatcher" ref="credentialsMatcher"/>  

  33.         <!--密碼校驗接口-->  

  34.         <property name="cachingEnabled" value="true"/>  

  35.         <property name="authenticationCachingEnabled" value="true"/>  

  36.         <property name="authenticationCacheName" value="authenticationCache"/>  

  37.         <property name="authorizationCachingEnabled" value="true"/>  

  38.         <property name="authorizationCacheName" value="authorizationCache"/>  

  39.     </bean>  

  40.   

  41.     <!-- 會話ID生成器 -->  

  42.     <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>  

  43.   

  44.     <!-- 會話Cookie模板 -->  

  45.     <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">  

  46.         <constructor-arg value="sid"/>  

  47.         <property name="httpOnly" value="true"/>  

  48.         <property name="maxAge" value="180000"/>  

  49.     </bean>  

  50.   

  51.     <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">  

  52.         <constructor-arg value="rememberMe"/>  

  53.         <property name="httpOnly" value="true"/>  

  54.         <property name="maxAge" value="2592000"/>  

  55.         <!-- 30天 -->  

  56.     </bean>  

  57.   

  58.     <!-- rememberMe管理器 -->  

  59.     <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">  

  60.         <property name="cipherKey"  

  61.                   value="#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/>  

  62.         <property name="cookie" ref="rememberMeCookie"/>  

  63.     </bean>  

  64.   

  65.     <!-- 會話DAO -->  

  66.     <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">  

  67.         <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/>  

  68.         <property name="sessionIdGenerator" ref="sessionIdGenerator"/>  

  69.     </bean>  

  70.   

  71.     <!-- 會話驗證調度器 -->  

  72.     <bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler">  

  73.         <property name="sessionValidationInterval" value="1800000"/>  

  74.         <property name="sessionManager" ref="sessionManager"/>  

  75.     </bean>  

  76.   

  77.     <!-- 會話管理器 -->  

  78.     <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">  

  79.         <property name="globalSessionTimeout" value="1800000"/>  

  80.         <property name="deleteInvalidSessions" value="true"/>  

  81.         <property name="sessionValidationSchedulerEnabled" value="true"/>  

  82.         <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>  

  83.         <property name="sessionDAO" ref="sessionDAO"/>  

  84.         <property name="sessionIdCookieEnabled" value="true"/>  

  85.         <property name="sessionIdCookie" ref="sessionIdCookie"/>  

  86.     </bean>  

  87.   

  88.     <!-- 安全管理器 -->  

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

  90.         <property name="realm" ref="userRealm"/>  

  91.         <property name="sessionManager" ref="sessionManager"/>  

  92.         <property name="cacheManager" ref="cacheManager"/>  

  93.         <property name="rememberMeManager" ref="rememberMeManager"/>  

  94.     </bean>  

  95.   

  96.     <!-- 相當於調用SecurityUtils.setSecurityManager(securityManager) -->  

  97.     <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">  

  98.         <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/>  

  99.         <property name="arguments" ref="securityManager"/>  

  100.     </bean>  

  101.   

  102.     <!--下面的loginUrl有兩個必要條件,一個登陸校驗失敗以後會強制客戶端redirect到這個url,  

  103.     另外一個是登陸的表單(含有用戶名及密碼)必須action到這個url-->  

  104.     <!-- 自定義的能夠接收校驗碼的身份驗證過濾器  

  105.      跳轉問題太他媽詭異了,不用了,自己寫代碼控制如何跳轉了  

  106.     <bean id="formAuthenticationFilter" class="com.shinowit.framework.security.filter.ValidFormAuthenticationFilter">  

  107.         <property name="usernameParam" value="loginName"/>  

  108.         <property name="passwordParam" value="loginPass"/>  

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

  110.     </bean>  

  111. -->  

  112.   

  113.     <!-- Shiro的Web過濾器 -->  

  114.     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  

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

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

  117.         <property name="unauthorizedUrl" value="/unauthorized.jsp"/>  

  118.         <property name="filters">  

  119.             <map>  

  120.                 <entry key="authc">  

  121.                     <bean class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter"/>  

  122.                 </entry>  

  123.             </map>  

  124.             <!--  

  125.             <util:map>  

  126.                 <entry key="authc" value-ref="formAuthenticationFilter"/>  

  127.             </util:map>  

  128.             -->  

  129.         </property>  

  130.         <property name="filterChainDefinitions">  

  131.             <value>  

  132.                 /index.jsp = anon  

  133.                 /validcode.jsp = anon  

  134.                 /login/ = anon  

  135.                 /static/** = anon  

  136.                 /js/** = anon  

  137.                 /img/** = anon  

  138.                 /unauthorized.jsp = anon  

  139.                 #/login/checklogin = authc  

  140.                 /login/checklogin = anon  

  141.                 /login/logoutlogout = logout  

  142.                 /** = user  

  143.             </value>  

  144.         </property>  

  145.     </bean>  

  146.   

  147.     <!-- Shiro生命週期處理器-->  

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

  149.   

  150.   

  151. </beans>  

 哦,對了,裏面那個fuck那個url是用來改密碼的,因爲數據庫裏面的密碼是加密的,不這麼整總也不可能知道對的md5值是多少。

 

但願沒有忘記什麼內容,挺墨跡的,不過能跑起來以後後邊關於權限和安全的處理就簡單多了,寫寫註解或者標籤就搞定了,很爽。


核心技術:Maven,Springmvc mybatis shiro, Druid, Restful, 

Dubbo, ZooKeeper,Redis,FastDFS,ActiveMQ,Nginx 
1.     項目核心代碼結構截圖

分佈式框架介紹 - kafkaee - kafkaee的博客

   項目模塊依賴

分佈式框架介紹 - kafkaee - kafkaee的博客


特別提醒:開發人員在開發的時候可以將自己的業務REST服務化或者Dubbo服務化

2.    項目依賴介紹

   2.1 後臺管理系統、Rest服務系統、Scheculer定時調度系統依賴如下圖:

 

分佈式框架介紹 - kafkaee - kafkaee的博客

       2.2 Dubbo獨立服務項目依賴如下圖:

 分佈式框架介紹 - kafkaee - kafkaee的博客

3.  項目功能部分截圖:

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客

zookeeper、dubbo服務啓動 

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客

dubbo管控臺 

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客

 REST服務平臺

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客

 

分佈式框架介紹 - kafkaee - kafkaee的博客


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章