Shiro權限管理架構詳解
1 權限管理1.1 什麼是權限管理
基本上涉及到使用者參與的系統都要進行權限管理,權限管理屬于系統安全的範疇,權限管理實作對使用者通路系統的控制,按照安全規則或者安全政策控制使用者可以通路而且隻能通路自己被授權的資源。
權限管理包括使用者身份認證和授權兩部分,簡稱認證授權。對于需要通路控制的資源使用者首先經過身份認證,認證通過後使用者具有該資源的通路權限方可通路。
1.2 使用者身份認證1.2.1 概念
身份認證,就是判斷一個使用者是否為合法使用者的處理過程。最常用的簡單身份認證方式是系統通過核對使用者輸入的使用者名和密碼,看其是否與系統中存儲的該使用者的使用者名和密碼一緻,來判斷使用者身份是否正确。對于采用指紋等系統,則出示指紋;對于硬體Key等刷卡系統,則需要刷卡。
1.2.2 使用者名密碼身份認證流程
1.2.3 關鍵對象
上邊的流程圖中需要了解以下關鍵對象:
Subject:主體
通路系統的使用者,主體可以是使用者、程式等,進行認證的都稱為主體;
Principal:身份資訊
是主體(subject)進行身份認證的辨別,辨別必須具有唯一性,如使用者名、手機号、郵箱位址等,一個主體可以有多個身份,但是必須有一個主身份(Primary Principal)。
credential:憑證資訊
是隻有主體自己知道的安全資訊,如密碼、證書等。
1.3 授權1.3.1 概念
授權,即通路控制,控制誰能通路哪些資源。主體進行身份認證後需要配置設定權限方可通路系統的資源,對于某些資源沒有權限是無法通路的。
1.3.2 授權流程
下圖中橙色為授權流程。
1.3.3 關鍵對象
授權可簡單了解為who對what(which)進行How操作:
Who,即主體(Subject),主體需要通路系統中的資源。
What,即資源(Resource),如系統菜單、頁面、按鈕、類方法、系統商品資訊等。資源包括資源類型和資源執行個體,比如商品資訊為資源類型,類型為t01的商品為資源執行個體,編号為001的商品資訊也屬于資源執行個體。
How,權限/許可(Permission),規定了主體對資源的操作許可,權限離開資源沒有意義,如使用者查詢權限、使用者添權重限、某個類方法的調用權限、編号為001使用者的修改權限等,通過權限可知主體對哪些資源都有哪些操作許可。
權限分為粗顆粒和細顆粒,粗顆粒權限是指對資源類型的權限,細顆粒權限是對資源執行個體的權限。
主體、資源、權限關系如下圖:
1.3.4 權限模型
對上節中的主體、資源、權限通過資料模型表示。
主體(賬号、密碼)
資源(資源名稱、通路位址)
權限(權限名稱、資源id)
角色(角色名稱)
角色和權限關系(角色id、權限id)
主體和角色關系(主體id、角色id)
如下圖:
通常企業開發中将資源和權限表合并為一張權限表,如下:
資源(資源名稱、通路位址)
權限(權限名稱、資源id)
合并為:
權限(權限名稱、資源名稱、資源通路位址)
上圖常被稱為權限管理的通用模型,不過企業在開發中根據系統自身的特點還會對上圖進行修改,但是使用者、角色、權限、使用者角色關系、角色權限關系是需要去了解的。
1.3.5 權限配置設定
對主體配置設定權限,主體隻允許在權限範圍内對資源進行操作,比如:對u01使用者配置設定商品修改權限,u01使用者隻能對商品進行修改。
權限配置設定的資料通常需要持久化,根據上邊的資料模型建立表并将使用者的權限資訊存儲在資料庫中。
1.3.6 權限控制
使用者擁有了權限即可操作權限範圍内的資源,系統不知道主體是否具有通路權限需要對使用者的通路進行控制。
1.3.6.1 基于角色的通路控制
RBAC基于角色的通路控制(Role-Based Access Control)是以角色為中心進行通路控制,比如:主體的角色為總經理可以查詢企業營運報表,查詢員工工資資訊等,通路控制流程如下:
上圖中的判斷邏輯代碼可以了解為:
if(主體.hasRole("總經理角色id")){
查詢工資
}
缺點:以角色進行通路控制粒度較粗,如果上圖中查詢工資所需要的角色變化為總經理和部門經理,此時就需要修改判斷邏輯為“判斷主體的角色是否是總經理或部門經理”,系統可擴充性差。
修改代碼如下:
if(主體.hasRole("總經理角色id") || 主體.hasRole("部門經理角色id")){
查詢工資
}
1.3.6.2 基于資源的通路控制
RBAC基于資源的通路控制(Resource-Based Access Control)是以資源為中心進行通路控制,比如:主體必須具有查詢工資權限才可以查詢員工工資資訊等,通路控制流程如下:
上圖中的判斷邏輯代碼可以了解為:
if(主體.hasPermission("查詢工資權限辨別")){
查詢工資
}
優點:系統設計時定義好查詢工資的權限辨別,即使查詢工資所需要的角色變化為總經理和部門經理也隻需要将“查詢工資資訊權限”添加到“部門經理角色”的權限清單中,判斷邏輯不用修改,系統可擴充性強。
1 權限管了解決方案1.1 粗顆粒度和細顆粒度1.1.1 什麼是粗顆粒度和細顆粒度
對資源類型的管理稱為粗顆粒度權限管理,即隻控制到菜單、按鈕、方法,粗粒度的例子比如:使用者具有使用者管理的權限,具有導出訂單明細的權限。對資源執行個體的控制稱為細顆粒度權限管理,即控制到資料級别的權限,比如:使用者隻允許修改本部門的員工資訊,使用者隻允許導出自己建立的訂單明細。
1.1.2 如何實作粗顆粒度和細顆粒度
對于粗顆粒度的權限管理可以很容易做系統架構級别的功能,即系統功能操作使用統一的粗顆粒度的權限管理。
對于細顆粒度的權限管理不建議做成系統架構級别的功能,因為對資料級别的控制是系統的業務需求,随着業務需求的變更業務功能變化的可能性很大,建議對資料級别的權限控制在業務層個性化開發,比如:使用者隻允許修改自己建立的商品資訊可以在service接口添加校驗實作,service接口需要傳入目前操作人的辨別,與商品資訊建立人辨別對比,不一緻則不允許修改商品資訊。
1.2 基于url攔截
基于url攔截是企業中常用的權限管理方法,實作思路是:将系統操作的每個url配置在權限表中,将權限對應到角色,将角色配置設定給使用者,使用者通路系統功能通過Filter進行過慮,過慮器擷取到使用者通路的url,隻要通路的url是使用者配置設定角色中的url則放行繼續通路。
如下圖:
1.3 使用權限管理架構
對于權限管理基本上每個系統都有,使用權限管理架構完成權限管理功能的開發可以節省系統開發時間,并且權限管理架構提供了完善的認證和授權功能有利于系統擴充維護,但是學習權限管理架構是需要成本的,是以選擇一款簡單高效的權限管理架構顯得非常重要。
1 基于url攔截實作1.1 環境準備
jdk:1.7.0_72
web容器:tomcat7
系統架構:springmvc3.2.0+mybatis3.2.7
(詳細參考springmvc教案)
前台UI:jquery easyUI1.2.2
1.2 資料庫
建立mysql5.1資料庫
建立使用者表、角色表、權限表、角色權限關系表、使用者角色關系表。
導入腳本,先導入shiro_sql_talbe.sql再導入shiro-sql_table_data.sql
1.3 activeUser使用者身份類
使用者登陸成功記錄activeUser資訊并将activeUser存入session。
1.4 anonymousURL.properties
anonymousURL.properties公開通路位址,無需身份認證即可通路。
1.5 commonURL.properties
commonURL.properties公共通路位址,身份認證通過無需配置設定權限即可通路。
1.6 使用者身份認證攔截器
使用springmvc攔截器對使用者身份認證進行攔截,如果使用者沒有登陸則跳轉到登陸頁面,本功能也可以使用filter實作 。
1.7 使用者授權攔截器
使用springmvc攔截器對使用者通路url進行攔截,如果使用者通路的url沒有配置設定權限則跳轉到無權操作提示頁面(refuse.jsp),本功能也可以使用filter實作。
1.8 使用者登陸
使用者輸入使用者賬号和密碼登陸,登陸成功将使用者的身份資訊(使用者賬号、密碼、權限菜單、權限url等)記入activeUser類,并寫入session。
1.8.1 controller
1.8.2 service接口
1 shiro介紹1.1 什麼是shiro
Shiro是apache旗下一個開源架構,它将軟體系統的安全認證相關的功能抽取出來,實作使用者身份認證,權限授權、加密、會話管理等功能,組成了一個通用的安全認證架構。
1.2 為什麼要學shiro
既然shiro将安全認證相關的功能抽取出來組成一個架構,使用shiro就可以非常快速的完成認證、授權等功能的開發,降低系統成本。
shiro使用廣泛,shiro可以運作在web應用,非web應用,叢集分布式應用中越來越多的使用者開始使用shiro。
java領域中spring security(原名Acegi)也是一個開源的權限管理架構,但是spring security依賴spring運作,而shiro就相對獨立,最主要是因為shiro使用簡單、靈活,是以現在越來越多的使用者選擇shiro。
1.3 Shiro架構
1.3.1 Subject
Subject即主體,外部應用與subject進行互動,subject記錄了目前操作使用者,将使用者的概念了解為目前操作的主體,可能是一個通過浏覽器請求的使用者,也可能是一個運作的程式。Subject在shiro中是一個接口,接口中定義了很多認證授相關的方法,外部程式通過subject進行認證授,而subject是通過SecurityManager安全管理器進行認證授權
1.3.2 SecurityManager
SecurityManager即安全管理器,對全部的subject進行安全管理,它是shiro的核心,負責對所有的subject進行安全管理。通過SecurityManager可以完成subject的認證、授權等,實質上SecurityManager是通過Authenticator進行認證,通過Authorizer進行授權,通過SessionManager進行會話管理等。
SecurityManager是一個接口,繼承了Authenticator, Authorizer, SessionManager這三個接口。
1.3.3 Authenticator
Authenticator即認證器,對使用者身份進行認證,Authenticator是一個接口,shiro提供ModularRealmAuthenticator實作類,通過ModularRealmAuthenticator基本上可以滿足大多數需求,也可以自定義認證器。
1.3.4 Authorizer
Authorizer即授權器,使用者通過認證器認證通過,在通路功能時需要通過授權器判斷使用者是否有此功能的操作權限。
1.3.5 realm
Realm即領域,相當于datasource資料源,securityManager進行安全認證需要通過Realm擷取使用者權限資料,比如:如果使用者身份資料在資料庫那麼realm就需要從資料庫擷取使用者身份資訊。
注意:不要把realm了解成隻是從資料源取資料,在realm中還有認證授權校驗的相關的代碼。
1.3.6 sessionManager
sessionManager即會話管理,shiro架構定義了一套會話管理,它不依賴web容器的session,是以shiro可以使用在非web應用上,也可以将分布式應用的會話集中在一點管理,此特性可使它實作單點登入。
1.3.7 SessionDAO
SessionDAO即會話dao,是對session會話操作的一套接口,比如要将session存儲到資料庫,可以通過jdbc将會話存儲到資料庫。
1.3.8 CacheManager
CacheManager即緩存管理,将使用者權限資料存儲在緩存,這樣可以提高性能。
1.3.9 Cryptography
Cryptography即密碼管理,shiro提供了一套加密/解密的元件,友善開發。比如提供常用的散列、加/解密等功能。
1.4 shiro的jar包
與其它java開源架構類似,将shiro的jar包加入項目就可以使用shiro提供的功能了。shiro-core是核心包必須選用,還提供了與web整合的shiro-web、與spring整合的shiro-spring、與任務排程quartz整合的shiro-quartz等,下邊是shiro各jar包的maven坐标。
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.2.3</version>
</dependency>
<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>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-quartz</artifactId>
<version>1.2.3</version>
</dependency>
也可以通過引入shiro-all包括shiro所有的包:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.2.3</version>
</dependency>
參考lib目錄 :
1 shiro認證1.1 認證流程
1.2 入門程式(使用者登陸和退出)1.2.1 建立java工程
jdk版本:1.7.0_72
eclipse:elipse-indigo
1.2.2 加入shiro-core的Jar包及依賴包
1.2.3 log4j.properties日志配置檔案
log4j.rootLogger=debug, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n
1.2.4 shiro.ini
通過Shiro.ini配置檔案初始化SecurityManager環境。
配置eclipse支援ini檔案編輯:
在eclipse配置後,在classpath建立shiro.ini配置檔案,為了友善測試将使用者名和密碼配置的shiro.ini配置檔案中:
[users]
zhang=123
lisi=123
1.2.5 認證代碼
1.2.6 認證執行流程
1、 建立token令牌,token中有使用者送出的認證資訊即賬号和密碼
2、 執行subject.login(token),最終由securityManager通過Authenticator進行認證
3、 Authenticator的實作ModularRealmAuthenticator調用realm從ini配置檔案取使用者真實的賬号和密碼,這裡使用的是IniRealm(shiro自帶)
4、 IniRealm先根據token中的賬号去ini中找該賬号,如果找不到則給ModularRealmAuthenticator傳回null,如果找到則比對密碼,比對密碼成功則認證通過。
1.2.7 常見的異常
UnknownAccountException
賬号不存在異常如下:
org.apache.shiro.authc.UnknownAccountException: No account found for user。。。。
IncorrectCredentialsException
當輸入密碼錯誤會抛此異常,如下:
org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken - zhangsan, rememberMe=false] did not match the expected credentials.
更多如下:
DisabledAccountException(帳号被禁用)
LockedAccountException(帳号被鎖定)
ExcessiveAttemptsException(登入失敗次數過多)
ExpiredCredentialsException(憑證過期)等
1.3 自定義Realm
上邊的程式使用的是Shiro自帶的IniRealm,IniRealm從ini配置檔案中讀取使用者的資訊,大部分情況下需要從系統的資料庫中讀取使用者資訊,是以需要自定義realm。
1.3.1 shiro提供的realm
最基礎的是Realm接口,CachingRealm負責緩存處理,AuthenticationRealm負責認證,AuthorizingRealm負責授權,通常自定義的realm繼承AuthorizingRealm。
1.3.2 自定義Realm
1.3.3 shiro-realm.ini
[main]
#自定義 realm
customRealm=cn.itcast.shiro.authentication.realm.CustomRealm1
#将realm設定到securityManager
securityManager.realms=$customRealm
思考:這裡為什麼不用配置[users]了??
1.3.4 測試代碼
測試代碼同入門程式,将ini的位址修改為shiro-realm.ini。
分别模拟賬号不存在、密碼錯誤、賬号和密碼正确進行測試。
1.4 雜湊演算法
雜湊演算法一般用于生成一段文本的摘要資訊,雜湊演算法不可逆,将内容可以生成摘要,無法将摘要轉成原始内容。雜湊演算法常用于對密碼進行散列,常用的雜湊演算法有MD5、SHA。
一般雜湊演算法需要提供一個salt(鹽)與原始内容生成摘要資訊,這樣做的目的是為了安全性,比如:111111的md5值是:96e79218965eb72c92a549dd5a330112,拿着“96e79218965eb72c92a549dd5a330112”去md5破解網站很容易進行破解,如果要是對111111和salt(鹽,一個随機數)進行散列,這樣雖然密碼都是111111加不同的鹽會生成不同的散列值。
1.4.1 例子
1.4.2 在realm中使用
實際應用是将鹽和散列後的值存在資料庫中,自動realm從資料庫取出鹽和加密後的值由shiro完成密碼校驗。
1.4.2.1 自定義realm
1.4.2.2 realm配置
配置shiro-cryptography.ini
1.4.2.3 測試代碼
測試代碼同上個章節,注意修改ini路徑。
1 shiro授權1.1 授權流程
1.2 授權方式
Shiro 支援三種方式的授權:
程式設計式:通過寫if/else 授權代碼塊完成:
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
//有權限
} else {
//無權限
}
注解式:通過在執行的Java方法上放置相應的注解完成:
@RequiresRoles("admin")
public void hello() {
//有權限
}
JSP/GSP 标簽:在JSP/GSP 頁面通過相應的标簽完成:
<shiro:hasRole name="admin">
<!— 有權限—>
</shiro:hasRole>
本教程式授權測試使用第一種程式設計方式,實際與web系統內建使用後兩種方式。
1.3 授權測試1.3.1 shiro-permission.ini
建立存放權限的配置檔案shiro-permission.ini,如下:
在ini檔案中使用者、角色、權限的配置規則是:“使用者名=密碼,角色1,角色2...” “角色=權限1,權限2...”,首先根據使用者名找角色,再根據角色找權限,角色是權限集合。
1.3.2 權限字元串規則
權限字元串的規則是:“資源辨別符:操作:資源執行個體辨別符”,意思是對哪個資源的哪個執行個體具有什麼操作,“:”是資源/操作/執行個體的分割符,權限字元串也可以使用*通配符。
例子:
使用者建立權限:user:create,或user:create:*
使用者修改執行個體001的權限:user:update:001
使用者執行個體001的所有權限:user:*:001
1.3.3 測試代碼
測試代碼同認證代碼,注意ini位址改為shiro-permission.ini,主要學習下邊授權的方法,注意:在使用者認證通過後執行下邊的授權代碼。
1.3.4 基于角色的授權
對應的check方法:
上邊check方法如果授權失敗則抛出異常:
org.apache.shiro.authz.UnauthorizedException: Subject does not have role [.....]
1.3.5 基于資源授權
對應的check方法:
上邊check方法如果授權失敗則抛出異常:
org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [....]
1.4 自定義realm
與上邊認證自定義realm一樣,大部分情況是要從資料庫擷取權限資料,這裡直接實作基于資源的授權。
1.4.1 realm代碼
在認證章節寫的自定義realm類中完善doGetAuthorizationInfo方法,此方法需要完成:根據使用者身份資訊從資料庫查詢權限字元串,由shiro進行授權。
1.4.2 shiro-realm.ini
ini配置檔案還使用認證階段使用的,不用改變。
思考:shiro-permission.ini中的[roles]為什麼不需要了??
1.4.3 測試代碼
同上邊的授權測試代碼,注意修改ini位址為shiro-realm.ini。
1.4.4 授權執行流程
1、執行subject.isPermitted("user:create")
2、securityManager通過ModularRealmAuthorizer進行授權
3、ModularRealmAuthorizer調用realm擷取權限資訊
4、ModularRealmAuthorizer再通過permissionResolver解析權限字元串,校驗是否比對
1 shiro與項目內建開發
1.1 shiro與spring web項目整合
shiro與springweb項目整合在“基于url攔截實作的工程”基礎上整合,基于url攔截實作的工程的技術架構是springmvc+mybatis,整合注意兩點:
1、shiro與spring整合
2、加入shiro對web應用的支援
1.1.1 取消原springmvc認證和授權攔截器
去掉springmvc.xml中配置的LoginInterceptor和PermissionInterceptor攔截器。
1.1.2 加入shiro的 jar包
1.1.3 web.xml添加shiro Filter
1.1.4 applicationContext-shiro.xml
securityManager:這個屬性是必須的。
loginUrl:沒有登入認證的使用者請求将跳轉到此位址進行認證,不是必須的屬性,不輸入位址的話會自動尋找項目web項目的根目錄下的”/login.jsp”頁面。
unauthorizedUrl:沒有權限預設跳轉的頁面。
1.1.5 自定義realm
此realm先不從資料庫查詢權限資料,目前需要先将shiro整合完成,在上邊章節定義的realm基礎上修改。
1.1.6 登入
1.1.7 首頁
由于session由shiro管理,需要修改首頁的controller方法,将session中的資料通過model傳到頁面。
1.1.8 退出
由于使用shiro的sessionManager,不用開發退出功能,使用shiro的logout攔截器即可。
<!-- 退出攔截,請求logout.action執行退出操作 -->
/logout.action = logout
1.1.9 無權限refuse.jsp
當使用者無操作權限,shiro将跳轉到refuse.jsp頁面。
1.1.10 shiro過慮器總結
anon:例子/admins/**=anon 沒有參數,表示可以匿名使用。
authc:例如/admins/user/**=authc表示需要認證(登入)才能使用,FormAuthenticationFilter是表單認證,沒有參數
roles:例子/admins/user/**=roles[admin],參數可以寫多個,多個時必須加上引号,并且參數之間用逗号分割,當有多個參數時,例如admins/user/**=roles["admin,guest"],每個參數通過才算通過,相當于hasAllRoles()方法。
perms:例子/admins/user/**=perms[user:add:*],參數可以寫多個,多個時必須加上引号,并且參數之間用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],當有多個參數時必須每個參數都通過才通過,想當于isPermitedAll()方法。
rest:例子/admins/user/**=rest[user],根據請求的方法,相當于/admins/user/**=perms[user:method] ,其中method為post,get,delete等。
port:例子/admins/user/**=port[8081],當請求的url的端口不是8081是跳轉到schemal://serverName:8081?queryString,其中schmal是協定http或https等,serverName是你通路的host,8081是url配置裡port的端口,queryString是你通路的url裡的?後面的參數。
authcBasic:例如/admins/user/**=authcBasic沒有參數表示httpBasic認證
ssl:例子/admins/user/**=ssl沒有參數,表示安全的url請求,協定為https
user:例如/admins/user/**=user沒有參數表示必須存在使用者, 身份認證通過或通過記住我認證通過的可以通路,當登入操作時不做檢查
注:
anon,authcBasic,auchc,user是認證過濾器,
perms,roles,ssl,rest,port是授權過濾器
1.2 認證1.2.1 添加憑證比對器
添加憑證比對器實作md5加密校驗。
修改applicationContext-shiro.xml:
1.2.2 修改realm認證方法
修改realm代碼從資料庫中查詢使用者身份資訊,将sysService注入realm。
1.3 授權1.3.1 修改realm授權方法
修改realm代碼從資料庫中查詢權限資訊,将sysService注入realm。
1.3.2 對controller開啟AOP
在springmvc.xml中配置shiro注解支援,可在controller方法中使用shiro注解配置權限:
1.3.3 權限注解控制
商品查詢controller方法添權重限(item:query):
上邊代碼@RequiresPermissions("item:query")表示必須擁有“item:query”權限方可執行。
同理,商品修改controller方法添權重限(item:update):
1.3.4 jsp标簽控制1.3.4.1 标簽介紹
Jsp頁面添加:
<%@ tagliburi="http://shiro.apache.org/tags"prefix="shiro" %>
1.3.4.2 jsp頁面添加标簽
如果有商品修改權限頁面顯示“修改”連結。
1.4 緩存
shiro每次授權都會通過realm擷取權限資訊,為了提高通路速度需要添加緩存,第一次從realm中讀取權限資料,之後不再讀取,這裡Shiro和Ehcache整合。
1.4.1 添加Ehcache的jar包
1.4.2 配置cacheManager
在applicationContext-shiro.xml中配置緩存管理器。
1.4.3 配置shiro-ehcache.xml
1.4.4 清空緩存
當使用者權限修改後,使用者再次登陸shiro會自動調用realm從資料庫擷取權限資料,如果在修改權限後想立即清除緩存則可以調用realm的clearCache方法清除緩存。
realm中定義clearCached方法:
在權限修改後調用realm中的方法,realm已經由spring管理,是以從spring中擷取realm執行個體,調用clearCached方法。
1.5 session管理
在applicationContext-shiro.xml中配置sessionManager:
1.6 驗證碼1.6.1 自定義FormAuthenticationFilter
需要在驗證賬号和名稱之前校驗驗證碼。
1.6.2 FormAuthenticationFilter配置
修改applicationContext-shiro.xml中對FormAuthenticationFilter的配置。
在shiroFilter中添加filters:
formAuthenticationFilter定義
1.6.3 登陸頁面
添加驗證碼:
1.6.4 配置validatecode.jsp匿名通路
修改applicationContext-shiro.xml:
1.7 記住我
使用者登陸選擇“自動登陸”本次登陸成功會向cookie寫身份資訊,下次登陸從cookie中取出身份資訊實作自動登陸。
1.7.1 使用者身份實作java.io.Serializable接口
向cookie記錄身份資訊需要使用者身份資訊對象實作序列化接口,如下:
1.7.2 配置rememberMeManager
1.7.3 FormAuthenticationFilter配置
修改formAuthenticationFitler添加頁面中“記住我checkbox”的input名稱:
1.7.4 登陸頁面
在login.jsp中添加“記住我”checkbox。