shiro與ssm環境的搭建
阿新 • • 發佈:2018-12-10
最近在寫社團後臺管理系統,需要用到授權和認證。於是就學習了一下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這個框架算是搭好了,執行後不報錯,說明整合是沒有問題的。