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_72web容器:tomcat7系統框架:springmvc3.2.0+mybatis3.2.7(詳細參考springmvc教案)前臺UI:jquery easyUI1.2.21.2 資料庫創建mysql5.1資料庫創建用戶表、角色表、許可權表、角色許可權關係表、用戶角色關係表。導入腳本,先導入shiro_sql_talbe.sql再導入shiro-sql_table_data.sql

1.3 activeUser用戶身份類用戶登陸成功記錄activeUser信息並將activeUser存入session。

1.4 anonymousURL.propertiesanonymousURL.properties公開訪問地址,無需身份認證即可訪問。1.5 commonURL.propertiescommonURL.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 什麼是shiroShiro是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 SubjectSubject即主體,外部應用與subject進行交互,subject記錄了當前操作用戶,將用戶的概念理解為當前操作的主體,可能是一個通過瀏覽器請求的用戶,也可能是一個運行的程序。Subject在shiro中是一個介面,介面中定義了很多認證授相關的方法,外部程序通過subject進行認證授,而subject是通過SecurityManager安全管理器進行認證授權1.3.2 SecurityManagerSecurityManager即安全管理器,對全部的subject進行安全管理,它是shiro的核心,負責對所有的subject進行安全管理。通過SecurityManager可以完成subject的認證、授權等,實質上SecurityManager是通過Authenticator進行認證,通過Authorizer進行授權,通過SessionManager進行會話管理等。SecurityManager是一個介面,繼承了Authenticator, Authorizer, SessionManager這三個介面。1.3.3 AuthenticatorAuthenticator即認證器,對用戶身份進行認證,Authenticator是一個介面,shiro提供ModularRealmAuthenticator實現類,通過ModularRealmAuthenticator基本上可以滿足大多數需求,也可以自定義認證器。1.3.4 AuthorizerAuthorizer即授權器,用戶通過認證器認證通過,在訪問功能時需要通過授權器判斷用戶是否有此功能的操作許可權。1.3.5 realmRealm即領域,相當於datasource數據源,securityManager進行安全認證需要通過Realm獲取用戶許可權數據,比如:如果用戶身份數據在資料庫那麼realm就需要從資料庫獲取用戶身份信息。注意:不要把realm理解成只是從數據源取數據,在realm中還有認證授權校驗的相關的代碼。1.3.6 sessionManagersessionManager即會話管理,shiro框架定義了一套會話管理,它不依賴web容器的session,所以shiro可以使用在非web應用上,也可以將分散式應用的會話集中在一點管理,此特性可使它實現單點登錄。1.3.7 SessionDAOSessionDAO即會話dao,是對session會話操作的一套介面,比如要將session存儲到資料庫,可以通過jdbc將會話存儲到資料庫。1.3.8 CacheManagerCacheManager即緩存管理,將用戶許可權數據存儲在緩存,這樣可以提高性能。1.3.9 CryptographyCryptography即密碼管理,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_72eclipse:elipse-indigo1.2.2 加入shiro-core的Jar包及依賴包

1.2.3 log4j.properties日誌配置文件log4j.rootLogger=debug, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n1.2.4 shiro.ini通過Shiro.ini配置文件初始化SecurityManager環境。配置eclipse支持ini文件編輯:

在eclipse配置後,在classpath創建shiro.ini配置文件,為了方便測試將用戶名和密碼配置的shiro.ini配置文件中:[users]zhang=123lisi=1231.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]#自定義 realmcustomRealm=cn.itcast.shiro.authentication.realm.CustomRealm1#將realm設置到securityManagersecurityManager.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:*:0011.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.iniini配置文件還使用認證階段使用的,不用改變。思考: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 = logout1.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請求,協議為httpsuser:例如/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="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。
推薦閱讀:
相關文章