今天剛接觸shiro架構,以前也看到過,隻是沒有去學習,今天接觸一下,感覺還是很容易的,先就讓我們一步步探讨,看看shiro怎麼用,我們為什麼要用shiro,它能給我們帶來了什麼好處。
一、先學會怎麼樣使用shiro:
本人觀點,學知道,再使用,然後精通,因為此架構比較簡單,那麼讓我們直接進入前面兩步驟。
二、shiro 能做什麼
聲明:本文純屬個人了解
shiro 是一個權限管理架構,它能夠完成認證、授權、加密、會話管理等功能。認證和授權為權限控制的核心,簡單來說,“認證”就是證明你是誰? Web 應用程式一般做法通過表單送出使用者名及密碼達到認證目的。“授權”即是否允許已認證使用者通路受保護資源
這裡為大家推薦兩篇非常不錯的部落格,建議初學者可以先看看這兩篇部落格,對shiro有個初步了解以後再來跟着我一起學習,一些基本的解釋這裡就不說了大家可以參考部落格:
http://www.open-open.com/lib/view/open1334628062874.html
http://www.ibm.com/developerworks/cn/java/j-lo-shiro/
我相信看完上邊兩篇播客後你已經對shiro有了了解,下邊開始教大家如何使用shiro了
1.首先在web.xml中配置過濾器讓請求資源經過 Shiro 的過濾處理,這與其它過濾器的使用類似
<!-- Spring ApplicationContext配置檔案的路徑,可使用通配符,多個路徑用,号分隔 此參數用于後面的Spring Context Loader -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/applicationContext-shiro.xml
</param-value>
</context-param>
<!-- shiro security filter -->
<filter>
<!-- 這裡的filter-name要和spring的applicationContext-shiro.xml裡的
org.apache.shiro.spring.web.ShiroFilterFactoryBean的bean name相同 -->
<filter-name>shiroSecurityFilter</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>shiroSecurityFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.applicationContext-shiro.xml檔案中
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:util="http://www.springframework.org/schema/util" 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
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<description>Shiro安全配置</description>
<bean id="shiroSecurityFilter"
<!--初始化資源-->
class="cn.com.dhc.ec.web.admin.shiro.CustomShiroFilterFactoryBean">
<!-- shiro的核心安全接口 在 Shiro 認證與授權處理過程中,提及到 Realm。Realm 可以了解為讀取使用者資訊、角色及權限的 DAO。由于大多 Web 應用程式使用了關系資料庫,是以實作 JDBC Realm 是常用的做法-->
<property name="securityManager" ref="securityManager" />
<!-- 要求登入時的連結 -->
<property name="loginUrl" value="/login.jhtml" />
<!-- 登陸成功後要跳轉的連接配接 -->
<property name="successUrl" value="/index.jhtml" />
<!-- 無權通路時重定向到登入頁面 -->
<property name="unauthorizedUrl" value="/login.jhtml" />
<property name="filters">
<util:map>
<entry key="authc" value-ref="ecAuthenticationFilter" />
</util:map>
</property>
</bean>
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="storeShiroRealm" />
<!-- Security緩存,隻緩存角色和權限,不緩存認證資訊 -->
<property name="cacheManager">
<bean class="org.apache.shiro.cache.MemoryConstrainedCacheManager"></bean>
</property>
</bean>
<bean id="ecAuthenticationFilter" class="cn.com.dhc.ec.fw.web.shiro.EcAuthenticationFilter">
<property name="redirectToSavedRequest" value="false"></property>
<property name="errorJsonView">
<bean
class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
<property name="extractValueFromSingleKeyModel" value="false"></property>
</bean>
</property>
</bean>
<bean id="storeShiroRealm" class="cn.com.dhc.ec.web.admin.shiro.StoreShiroRealm">
<property name="credentialsMatcher" ref="ecCredentialsMatcher"></property>
<property name="authenticationCachingEnabled" value="false"></property>
</bean>
<!-- 密碼判斷器 -->
<bean id="ecCredentialsMatcher" class="cn.com.dhc.ec.fw.web.shiro.EcPasswordCrypter">
</bean>
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
<bean
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="staticMethod"
value="org.apache.shiro.SecurityUtils.setSecurityManager" />
<property name="arguments" ref="securityManager" />
</bean>
</beans>