1. 程式人生 > >shiro與ssm環境的搭建

shiro與ssm環境的搭建

 最近在寫社團後臺管理系統,需要用到授權和認證。於是就學習了一下shiro,這一篇文章用來記錄一下自己初次使用shiro來整合ssm,也方便初學者進行學習。此文章前提是已經配好ssm框架,還沒有整合ssm的小夥伴,請先完成ssm的配置。

一、新增shiro依賴

在pom.xml檔案中新增shiro的依賴

<!-- 新增shiro支援 -->
    <!--shiro核心包-->
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-core</artifactId>
      <version>1.2.3</version>
    </dependency>
   <!-- web相關包-->
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-web</artifactId>
      <version>1.2.3</version>
    </dependency>
    <!--與spring整合包-->
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-spring</artifactId>
      <version>1.2.3</version>
    </dependency>
    <!--快取包-->
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-ehcache</artifactId>
      <version>1.2.3</version>
    </dependency>
  </dependencies>

二、shiro在web.xml的配置

在web.xml中加入shiro的過濾器

  <!--Shiro過濾器-->
  <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>

三、自定義realm

在java中建立一個shiro包,新增CustomRealm類,繼承AuthorizingRealm

這裡會用到shiro的兩個方法doGetAuthorizationInfo和doGetAuthenticationInfo,用來授權和認證,不明白的小夥伴可以看看shiro的自定義realm教程

 
 
@Component
public class CustomRealm extends AuthorizingRealm {
 
	/**
	 * 授權
	 * realm授權方法 從輸入引數principalCollection得到身份資訊 根據身份資訊到資料庫查詢許可權資訊 將許可權資訊新增給授權資訊物件
	 * 返回 授權資訊物件(判斷使用者訪問url是否在許可權資訊中沒有體現)
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
		return null;
	}
 
	/**
	 * 認證
	 * 表單認證過濾器認證時會呼叫自定義Realm的認證方法進行認證,成功回到index.do,再跳轉到index.jsp頁面
	 *
	 * 前提:表單認證過濾器收集和組織使用者名稱和密碼資訊封裝為token物件傳遞給此方法
	 *
	 * token:封裝了身份資訊和憑證資訊 2步驟:比對身份 資訊;比對憑證
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		
		return null;
	}
}

四、shiro在applicationContext.xml的配置

這裡為了方便,沒有把它單獨與spring的配置分開,shiro的配置寫在了applicationContext.xml中,程式碼中有詳細註釋

  <!-- web.xml中shiro的filter對應的bean -->
    <!--掃描shiro中的realm-->
    <context:component-scan base-package="com.meng.shiro"/>
 
    <!-- Shiro 的Web過濾器 -->
    <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="/index"/> -->        <!-- 如果配置,成功認證後跳轉到index.do地址,通常不配置  -->
        <!-- <property name="unauthorizedUrl" value="/refuse"/> -->  <!-- 沒有許可權,跳轉到refuse.do地址,註解無效  -->
        <property name="filterChainDefinitions">
            <!--不用認證也可以訪問的url-->
            <value>
                /login*=anon
                /layuiadmin/**=anon
                /loginout=logout    <!--logout:登出過濾器,此攔截器設定的url可以不對應一個真實存在controller方法-->
                /**=authc           <!-- authc 表示需要認證才能訪問的頁面 -->
            </value>
        </property>
    </bean>
 
    <!-- 安全管理器定義 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="customRealm"/>                  <!-- 注入自定義Realm -->
        <property name="cacheManager" ref="cacheManager" />         <!-- 注入快取管理器 -->
        <property name="sessionManager" ref="sessionManager" />     <!-- 注入session管理器 -->
    </bean>
    <!-- 憑證匹配器 -->
    <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
        <property name="hashAlgorithmName" value="md5" /> <!-- 加密方式-->
        <property name="hashIterations" value="2" />      <!-- 雜湊次數-->
    </bean>
    <!-- 自定義Realm -->
    <bean id="customRealm" class="com.meng.shiro.CustomRealm">
        <!-- 將憑證匹配器設定到realm中,realm按照憑證匹配器的要求進行雜湊 -->
        <property name="credentialsMatcher" ref="credentialsMatcher"/>
    </bean>
    <!-- 快取管理器授權管理時候,每一次授權判斷都會重新到資料庫中查詢一次使用者對應button內心的許可權 -->
    <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManagerConfigFile" value="classpath:shiro-ehcache.xml"/>
    </bean>
    <!-- 會話管理器 -->
    <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <!-- session的失效時長(24小時),單位毫秒 -->
        <property name="globalSessionTimeout" value="86400000"/>
        <!-- 刪除失效的session -->
        <property name="deleteInvalidSessions" value="true"/>
    </bean>
 

五、在資源目錄下新增shiro-ehcache.xml快取配置檔案

<ehcache>
	<!--diskStore:快取資料持久化的目錄 地址  -->
	<diskStore path="G:\" />
	<defaultCache 
		maxElementsInMemory="1000" 
		maxElementsOnDisk="10000000"
		eternal="false" 
		overflowToDisk="false" 
		diskPersistent="false"
		timeToIdleSeconds="120"
		timeToLiveSeconds="120" 
		diskExpiryThreadIntervalSeconds="120"
		memoryStoreEvictionPolicy="LRU">
	</defaultCache>
</ehcache>

做到這裡,shiro整合ssm這個框架算是搭好了,執行後不報錯,說明整合是沒有問題的。