Java開源安全框架之Apache Shiro

 

APACHE SHIRO安全框架

1      背景

 

Shiro項目始於2003年初,當時它叫JSecurity項目,當時對於Java應用開發人員沒有太多的安全替代方案,始終被一個叫JAAS(Java認證/受權服務)束縛着,可是JAAS缺點太多了,如它的受權機制太拙劣,用起來讓人沮喪,又一方面JAAS跟虛擬機層面的安全問題關係很是緊密,如判斷JVM中判斷是否容許裝入一個類等,還有加密問題,JAVA中的密碼架構又是讓人難以理解。因而Jsecurity就誕生了,後來改名爲Shiro。html

直到2008年Shiro加入到了APACHE軟件基金會,直到如今它叫Apache Shiro。java

2      特性

Ø  易於使用 :易用性是這個項目的最終目標。web

Ø  普遍性:沒有其餘安全框架能夠達到Shiro宣傳的廣度,它能夠爲你的安全需求提供「一站式」服務。算法

Ø  靈活性:Shiro能夠工做在任何應用環境中,而不依賴於任何的應用環境。數據庫

Ø  Web能力:Shiro對Web應用支持很神奇,容許你基於URL和WEB協議建立靈活的安全策略,同時還提供了一套控制頁面輸出的JSP標籤庫。apache

Ø  可插拔:Shiro乾淨的API和設計模式能夠方便的與許多的其它框架和應用進行無縫集成。編程

Ø  支持:Shiro是APACHE軟件基金會的成員。設計模式

3      簡介

Apache Shiro是一個強大易用的Java安全框架,能夠用其爲你的應用護航。經過簡化應用安全的四個領域,即認證、受權、會話管理和加密,在真實應用中,應用安全能更容易被理解和實現。api

Shiro的簡單架構和兼容JavaBean幾乎可以在任何環境下配置和使用。附加的Web支持和輔助功能,好比多線程和測試支持,讓這個框架爲應用安全提供了「一站式」服務。Apache Shiro開發團隊將繼續前進,精煉代碼庫和支持社區。隨着持續被開源和商業應用採納,能夠預期Shiro會繼續發展壯大。數組

(1)認證:用戶身份識別,常被稱之爲「登錄」操做。

(2)受權:訪問控制。

(3)加密:密碼加密,保護數據以防被偷窺。

(4)會話:會話管理,每用戶相關的時間敏感的狀態。

4      SHIRO重要組件


 

Shiro組件圖形 1 重要組件

一. 主要的特性:

1.Authentication: 認證(也就是登錄),這是一個證實用戶所說的他們是誰的行爲。

2.Authorization: 受權(訪問控制的過程),也就是說「誰」去訪問了什麼。

3.Session Manager: 管理用戶特定的會話,即便在非Web或EJB的應用程序中。

4.Cryptography: 經過使用加密算法保護數據安全同時易於使用。

二. 支持的特性:

1.Web Support: Web支持:Shiro Web API可以輕鬆的幫助保護Web應用程序。

2.Caching: 緩存支持:可讓安全操做快速而高效。

3.Concurrency: 多線程支持:Apache Shiro利用它的併發特性來支持多線程應用程序。

4.Testing: 測試支持:幫助你編寫單元測試和集成測試,確保你的應用可以按如期同樣安全。

5.「Run As」: 一個容許用戶假設爲另外一個用戶身份的功能。

6.「Remember Me」: 在會話中記住用戶身份,因此咱們只須要在強制的時候登錄。

5      SHIRO核心組件


 

Shiro組件圖形 2 核心組件

1.Subject:

即當前操做用戶,可是在Shiro中,Subject這一律念並不只僅指人,也考慮到第三方進程、後臺帳戶或者其餘相似事物,它僅僅意味着「當前跟軟件交互的東西」,你能夠把它認爲是Shiro的「用戶」概念。Subject表明了當前用戶的安全操做,SecurityManager則管理全部用戶的安全操做。

2.SecurityManager:

它是Shiro框架的核心,Shiro經過SecurityManager來管理內部組件實例,並經過它來提供安全管理的各類服務。

特性:

Ø  基於POJO實現

Ø  簡單的客戶端存儲

Ø  獨立的容易集成

Ø  異構的客戶端訪問

Ø  事件的監聽

Ø  主機地址的保留

Ø  不活動/過時的支持

Ø  網絡支持

Ø  支持SSO

3.Realm:

Realm充當了Shiro與應用安全數據間的「橋樑」或者「鏈接器」。也就是說,當用戶執行認證、受權的時候,Shiro會從應用配置的Realm中查找用戶及權限信息。在配置Shiro時,你必須至少指定一個Realm用於認證和受權,配置多個Realm是沒有問題的,可是至少須要配置一個。Realm內置了大量的安全的數據源,如:JDBC(關係型數據庫)的Realm,LDAP(目錄)的Realm,INI文本配置資源的Realm等,若是默認的Realm不能知足要求,還能夠插入表明自定義數據源的Realm實現。

 

6      SHIRO架構圖


 

Shiro組件圖形 3 架構圖

7      SHIRO認證過程


 

Shiro組件圖形 4 認證過程

第一步:

應用程序構建一個終端用戶認證信息的AuthenticationToken實例後,調用Subject.login()方法。

第二步:

Subject的實例一般是DelegaingSubject類或它的子類實例對象,在認證時,會委託應用程序設置securityManager實例而後調用securityManager.login(token)方法。

第三步:

 SecurityManager接收到token信息後會委託內置的Authenticator實例(一般

都是ModularRealmAuthenticator類的實例)調用authenticator.authenticate(token).

ModularRealmAuthenticator在認證過程當中會對設置的一個或多個Realm實例進行適配,它實際上爲Shiro提供一個可插拔的認證機制。

第四步:

若是在應用程序中配置多個Realm,ModularRealmAuthenticator會根據配置AuthenticationStrategy(認證策略)來進行多Realm的認證過程。在Realm被調用後,AuthenticationStrategy將對每個Realm的結果作出相應。(若是應用程序中僅配置一個Realm,Realm將被直接調用無需再配置認證策略)

第五步:

判斷每個Realm是否支持提交的Token,若是支持,Realm將調用getAuthenticationInfo(token),這個方法就是實際認證處理,咱們經過覆蓋Realm的doGetAuthenticationInfo方法來編寫咱們自定義的認證處理。

7.1    記住我和已認證

1.Shiro的RememberMe 和 經過認證的Authenticated有明確的區分:

(1).Remembered(記住我):

一個已記住的Subject不是匿名的,並且有一個已知的身份ID(也就是調用subject.getPrincipals()方法是非空的),可是這個被記住的身份ID是在以前的Session中被認證的,若是調用subject.isRemembered()返回true,則Subject被認爲是被記住的。

(2).Authenticated(已認證):

一個已認證的Subject是指在當前Session中被成功地驗證過了(也就是說subject.login()方法被調用並且沒有拋出異常),若是調用subject.isAuthenticated()返回true則認爲Subject已經過驗證。

注意:Remembered和Authenticated是互斥的,其中一個爲真則另外一個爲假,反之亦然。

7.2    令牌

1. 令牌是一個鍵,能夠用它登錄一個系統,經常使用令牌是UsernamePasswordToken,用它能夠指定用戶名和密碼。

2. UsernamePasswordToken類適用於大多數應用程序,能夠擴展這個接口來提供您應用程序用來驗證身份的一個關鍵文件內容。

3. 若是用戶密碼不正確會拋出:IncorrectCredentialsException,在生產代碼中顯示處理;

若是用戶帳戶不正確會拋出:UnknownAccountException,在生產代碼中顯示處理;

若是用戶帳戶被鎖定會拋出:LockedAccountException,在生產代碼中顯示處理;

登錄失敗時其它異常會拋出:AuthenticationException,在生產代碼中顯示處理;

注意:既然能提供詳細的用戶名和密碼驗證信息,可是咱們最好不要提供詳細的提示,避免用戶猜想來登錄系統。

7.3    認證策略

若是你的應用程序中使用多個Realm從多個數據源獲取帳戶資料,AuthenticationStrategy是最終爲最後的「合併」可以被應用程序理解的Subject的身份的視圖負責人。

認證策略的類

描述

AtLeastOneSuccessfulStrategy

若是一個或更多的Realm驗證成功,則總體嘗試被認爲是成功的,若是沒有一個驗證成功,則總體嘗試失敗。

FirstSuccessfulStrategy

只有第一個成功的驗證Realm返回的信息將被使用,全部進一步的Realm將被忽略,若是沒有一個驗證成功,則總體嘗試失敗。

AllSuccessfulStrategy

爲了總體的嘗試成功,全部配置的Realm必須驗證成功,若是沒有一個驗證成功,則總體嘗試失敗。

7.4    註銷

註銷就是釋放全部已知的識別狀態,調用subject.logout()方法來釋放識別狀態信息。

調用logout會發生:

(1). 現有的Session將會失效,任何的身份將失去關聯。

(2). RememberMe cookie也將被刪除。

注意:因爲Web應用程序依靠Cookies來記住用戶身份,而後Cookies只能在Response被committed以前被刪除,因此建議在調用註銷方法以後將終端用戶重定向到一個新的視圖或頁面,這樣可以保證任何的安全相關的Cookies都能想預期同樣被刪除,這個是http cookies的功能,不是Shiro的。

8      SHIRO受權過程



 

Shiro組件圖形 5 受權過程

 

第一步:

在應用程序中調用受權驗證方法(例如:Subject的isPermitted*或者hasRole*等等)。

第二步:

Subject實例一般是DelegatingSubject的類或者它子類的實例對象,在認證開始時,會委託應用程序設置securityManager實例調用相應的 isPermitted*或者hasRole*方法。

第三步:

接下來SecurityManager會委託內置的Authorizer實例(默認是

ModularRealmAuthorizer類的實例,它支持一個或者多個Realm實例認證)調用相應的受權方法。

第四步:

每個Realm將檢查是否實現了相同的Authorizer接口,而後,將調用Realm本身相應的受權驗證方法。

8.1    權限粒度

Shiro權限聲明能夠作到很是細粒度,權限聲明一般是使用以冒號分隔的表達式,一個權限表達式能夠清晰的指定資源類型、容許的操做、可訪問的數據。同時Shiro權限表達式支持簡單的通配符,能夠更加靈活的進行權限設置。

8.2    角色模式

Shiro的角色模式有傳統角色、權限角色兩種角色模式。

(1). 隱式角色(舊RBAC):當須要對某一操做進行受權時,只須要判斷是否擁有該角色便可,這種角色權限相對簡單、模糊。

(2). 顯示角色(新RBAC):一個角色擁有一個權限集合,受權時,須要判斷當前角色是否擁有該權限,這種角色權限能夠對用戶詳細的權限描述。

8.3    受權實現方式

Shiro支持三種受權方式,即編碼方式、註解方式、自定義標籤方式。

8.3.1 編碼實現

8.3.1.1Subject API【經常使用】

類型

方法和描述

void

checkPermission(Permission permission)

檢查是否擁有指定的權限對象

void

checkPermission(String permission) 

檢查是否擁有指定的權限字符串

void

checkPermissions(Collection<Permission> permissions) 
檢查是否擁有指定的全部權限對象

void

checkPermissions(String... permissions) 

檢查是否擁有指定的全部權限字符串

void

checkRole(String roleIdentifier) 

斷言Subject擁有指定的角色

void

checkRoles(Collection<String> roleIdentifiers)

斷言Subject擁有集合的全部角色

void

checkRoles(String... roleIdentifiers)

斷言Subject擁有指定所有字符數組權限

Object

getPrincipal()

返回應用程序範圍的Subject惟一當事人標識,若是爲NULL說明Subject是匿名的。

Session

getSession()

返回與Subject相關的應用程序會話

boolean

hasAllRoles(Collection<String> roleIdentifiers)

若是Subject擁有指定的集合角色,返回True不然false

boolean

hasRole(String roleIdentifier)

若是Subject擁有指定字符串角色,返回Treu,不然false

Boolean[]

hasRoles(List<String> roleIdentifiers)

檢查Subject是否擁有指定的角色,返回一個布爾型數組。

boolean

isAuthenticated()

是否被認證過,返回True,若是Subject/User證實了本身的身份在當前會話中

boolean[]

isPermitted(List<Permission> permissions)

檢查是否擁有指定的權限集合,返回一個布爾值數組。

boolean

isPermitted(Permission permission)

若是Subject擁有指定的權限,返回True,不然返回false

boolean

isPermitted(String... permissions)

檢查是否擁有指定權限數組,返回一個布爾型數組。

boolean

isPermitted(String permission)

若是Subject擁有指定權限字符串權限,返回True,不然返回false

boolean

isPermittedAll(Collection<Permission> permissions)

若是Subject擁有指定集合的全部權限,返回True,不然返回False

boolean

isPermittedAll(String... permissions)

若是Subject擁有指定字符數組的全部權限,返回True,不然返回False

boolean

isRemembered()

若是Subject不是匿名的,返回True,不然返回False

void

login(AuthenticationToken token)

執行Subject的登錄操做

void

logout()

退出登錄,移除Subject相關認證和受權數據

 

8.3.2 註解實現

Shiro註解支持AspectJ、Spring、Google-Guice等,可根據應用進行不一樣的配置,註解可用於類/屬性/方法。

8.3.2.1@ RequiresAuthentication

用於代表訪問該資源的用戶需是通過認證。

8.3.2.2@ RequiresGuest

代表訪問該資源的用戶爲Guest用戶。

8.3.2.3@ RequiresPermissions

當前用戶需擁有指定權限。

8.3.2.4@ RequiresRoles

當前用戶需擁有指定角色。

8.3.2.5@ RequiresUser

當前用戶需爲已認證用戶或已記住用戶。

8.3.3 標籤實現

8.3.3.1JspTaglib實現

Shiro提供了一套JSP標籤來實現頁面受權訪問控制:在使用Shiro標籤庫前,首先須要在JSP引入shiro標籤:

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

8.3.3.2guest標籤

驗證當前用戶是否爲「訪客」,即未認證(包含未記住)的用戶

<shiro:guest>

 Hi there!  Please <a href="login.jsp">Login</a> or

 <a href="signup.jsp">Signup</a> today!

</shiro:guest>

8.3.3.3user標籤 

認證經過或已記住的用戶 

<shiro:user>

    Welcome back John!  Not John? Click <a href="login.jsp">here<a> to login.

</shiro:user>

8.3.3.4authenticated標籤 

已認證經過的用戶。不包含已記住的用戶,這是與user標籤的區別所在。

<shiro:authenticated>

    <a href="updateAccount.jsp">Update your contact information</a>.

</shiro:authenticated>

8.3.3.5notAuthenticated標籤 

未認證經過用戶,與authenticated標籤相對應。與guest標籤的區別是,該標籤包含已記住用戶。

<shiro:notAuthenticated>

    Please <a href="login.jsp">login</a> in order to update your credit card information.

</shiro:notAuthenticated>

8.3.3.6principal標籤

輸出當前用戶信息,一般爲登陸賬號信息。

Hello, <shiro:principal/>, how are you today?

8.3.3.7hasRole標籤 

驗證當前用戶是否屬於該角色

<shiro:hasRole name="administrator">

    <a href="admin.jsp">Administer the system</a>

</shiro:hasRole>

8.3.3.8lacksRole標籤 

與hasRole標籤邏輯相反,當用戶不屬於該角色時驗證經過

<shiro:lacksRole name="administrator">

    Sorry, you are not allowed to administer the system.

</shiro:lacksRole>

8.3.3.9hasAnyRole標籤

驗證當前用戶是否屬於如下任意一個角色。

<shiro:hasAnyRoles name="developer, project manager, administrator">

    You are either a developer, project manager, or administrator.

</shiro:lacksRole>

8.3.3.10        hasPermission標籤 

驗證當前用戶是否擁有指定權限。

<shiro:hasPermission name="user:create">

    <a href="createUser.jsp">Create a new User</a>

</shiro:hasPermission>

8.3.3.11        lacksPermission標籤 

與hasPermission標籤邏輯相反,當前用戶沒有指定權限時,驗證經過 。

<shiro:hasPermission name="user:create">

    <a href="createUser.jsp">Create a new User</a>

</shiro:hasPermission>

9      術語

9.1    Authentication

身份驗證是驗證Subject 身份的過程——實質上是證實某些人是否真的是他們所說的他們是誰。當認證嘗試成功後,應用程序可以相信該subject 被保證是其所指望的。

9.2    Authorization

受權,又稱爲訪問控制,是決定一個user/Subject 是否被容許作某事的過程。它一般是經過檢查和解釋Subject的角色和權限(見下文),而後容許或拒絕到一個請求的資源或功能來完成的。

9.3    Cipher['saɪfə]

密碼是進行加密或解密的一種算法。該算法通常依賴於一塊被稱爲key 的信息。基於不一樣的key 的加密算法也是不同的,因此解密沒有它是很是困難的。密碼有不一樣的表現形式。分組密碼致力於符號塊,一般是固定大小的,而流密碼致力於連續的符號流。對稱性密碼加密和解密使用相同的密鑰(key),而非對稱性加密使用不一樣的密鑰。若是非對稱性加密的密鑰不能從其餘地方獲得,那麼能夠建立公鑰/私鑰對公開共享。

9.4    Credential[krɪ'denʃ(ə)l]

憑證是一塊信息,用來驗證user/Subject 的身份。在認證嘗試期間,一個(或多個)憑證與Principals(s)被一同提交,來驗證user/Subject 所提交的確實是所關聯的用戶。證書一般是很是祕密的東西,只有特定的user/Subject 才知道,如密碼或PGP 密鑰或生物屬性或相似的機制。這個想法是爲principal 設置的,只有一我的會知道正確的證書來「匹配」該principal。若是當前user/Subject

提供了正確的憑證匹配了存儲在系統中的,那麼系統能夠假定並信任當前user/Subject 是真的他們所說的他們是誰。信任度隨着更安全的憑證類型加深(如,生物識別簽名 > 密碼)。

9.5    Cryptography[krɪp'tɒgrəfɪ]

加密是保護信息不受不但願的訪問的習慣作法,經過隱藏信息或將它轉化成無心義的東西,這樣沒人能夠理解它。Shiro 致力於加密的兩個核心要素:加密數據的密碼,如使用公鑰或私鑰的郵件,以及散列表(也稱消息摘要),它對數據進行不可逆的加密,如密碼。

9.6    Hash

散列函數是單向的,不可逆轉的輸入源,有時也被稱爲消息,在一個編碼的哈希值內部,有時也被稱爲消息摘要。它一般用於密碼,數字指紋,或以字節數組爲基礎的數據。

9.7    Permission

權限,至少按照Shiro 的解釋,是在應用程序中描述原始功能的一份聲明並無更多的功能。權限是在安全策略中最低級別的概念。它們僅定義了應用程序可以作「什麼」。它們沒有說明「誰」可以執行這些操做。權限只是行爲的聲明,僅此而已。

一些權限的例子:

 打開文件

 瀏覽'/user/list'頁面

 打印文檔

 刪除'jsmith'用戶

9.8    Principal ['prɪnsəp(ə)l]

Principal 是一個應用程序用戶(Subject)的任何標誌屬性。「標誌屬性」能夠是任何對你應用程序有意義的東西——用戶名,姓,名,社會安全號碼,用戶ID 等。這就是它——沒什麼古怪的。Shiro 也引用一些咱們稱之爲Subject 的primary principal 的東西。一個primary principal 是在整個應用程序中惟一標識Subject 的principal。理想的primary principal 是用戶名或RDBMS 用戶表主鍵——用戶ID。對於在應用程序中的用戶(Subject)來講,只有一個primary principal

9.9    Realm

Realm 是一個可以訪問應用程序特定的安全數據(如用戶,角色和權限)的組件。它能夠被看做是一個特定安全的DAO(Data Access Object)。Realm 將這些應用程序特定的數據轉換成Shiro 可以理解的格式,這樣Shiro反過來可以提供一個單一的易於理解的Subject 編程API,不管有多少數據源存在或不管你的數據是什麼樣的應用程序特定的格式。Realm 一般和數據源是一對一的對應關係,如關係數據庫,LDAP 目錄,文件系統,或其餘相似資源。所以,Realm 接口的實現使用數據源特定的API 來展現受權數據(角色,權限等),如JDBC,文件IO,Hibernate 或JPA,或其餘數據訪問API。

9.10       Role

基於你對話的對象,一個角色的定義是能夠多變的。在許多應用程序中,它充其量是個模糊不清的概念,人們用它來隱式定義安全策略。Shiro 偏向於把角色簡單地解釋爲一組命名的權限的集合。這就是它——一個應用程序的惟一名稱,彙集一個或多個權限聲明。這是一個比許多應用程序使用的隱式的定義更爲具體的定義。若是你選擇了你的數據模型反映Shiro 的假設,你會發現將有更多控制安全策略的權力。

9.11       Session

會話是一個在一段時間內有狀態的數據,其上下文與一個單一的與軟件系統交互的user/Subject 相關聯。當Subject 使用應用程序時,可以從會話中添加/讀取/刪除數據,而且應用程序稍後可以在須要的地方使用該數據。會話會被終止,因爲user/Subject 註銷或會話不活動而超時。對於那些熟悉HttpSession 的,Shiro Session 服務於同一目標,除了Shiro 會話可以在任何環境下使用,甚至在沒有Servlet 容器或EJB 容器的環境。

9.12       Subject

Subject 只是一個精挑細選的安全術語,基本上的意思是一個應用程序用戶的安全特定的「視圖」。然而Subject不老是須要反映爲一我的——它能夠表明一個調用你應用程序的外部進程,或許是一個系統賬戶的守護進程,在一段時間內執行一些間歇性的東西(如一個cron job)。它基本上是任何使用應用程序作某事的實體的一個表明。

10            問題列表

10.1  如何實現無刷新登錄驗證提示?

http://www.kankanews.com/ICkengine/archives/48199.shtml

上面這個地址裏面有詳細介紹………

10.2       Realm是什麼?

Realm有iniRealm、jdbcRealm、ldapRealm等,在認證、受權內部實現機制中都有提到,最終處理都將交給Realm進行處理,由於在Shiro中,最終是經過Realm來獲取應用程序中的用戶、角色、權限的,一般狀況下,在Realm中會直接從咱們的數據源中獲取Shiro須要的認證信息,能夠說,Realm是專用於安全框架的Dao.

10.3       兩個Session的區別?

Subject currentUser = SecurityUtils.getSubject();

Session session = currentUser.getSession();

Session.setAttribute(「someKey」,someValue);

HttpServletRequest.getSession(Boolean create)和Subject.getSession(Booleancreate)方法有殊途同歸之效。

1. 若是Subject已經擁有了一個Session,則create參數被忽略且Session被當即返回。

2. 若是Subject尚未一個Session,且create參數爲true,則建立一個新的會話並返回該會話。

3. 若是Subject尚未一個Session,且create參數爲false,則不會建立新的會話且返回null。

10.4       URL過濾器如何配置?

Shiro主要是經過URL過濾來進行安全管理。

Shiro能夠經過配置文件實現基於URL的受權驗證。

每一個URL配置,表示匹配該URL的應用程序請求將由對應的過濾器進行驗證。

URL目錄是基於HttpServletRequest.getContextPath()此目錄設置。

URL可以使用通配符,**表明任意子目錄

Shiro驗證URL時,URL匹配成功便不在繼續匹配查找,因此要注意配置文件中的URL順序,尤爲在使用通配符時。

一個URL能夠配置多個Filter,使用逗號分隔。

當設置多個過濾器時,所有驗證經過,才視爲經過。

部分過濾器可指定參數,如perms, roles。

3. 攔截器類型:

過濾器名

過濾器說明

過濾器類

anon

匿名過濾器

org.apache.shiro.web.filter.authc.AnonymousFilter

anthc

若是繼續操做,須要作對應的表單驗證,不然不能經過

org.apache.shiro.web.filter.authc.FormAuthenticationFilter

authcBasic

基於http驗證過濾,若是不經過,跳轉到登錄頁面

org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter

logout

登陸退出過濾器

org.apache.shiro.web.filter.authc.LogoutFilter

noSessionCreation

沒有Session建立過濾器

org.apache.shiro.web.filter.session.NoSessionCreationFilter

perms

權限過濾器

org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter

port

端口過濾器,能夠設置是不是指定端口,若是不是跳轉到登錄頁面

org.apache.shiro.web.filter.authz.PortFilter

rest

http方法過濾器,能夠指定如post不能進行訪問等

org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter

roles

角色過濾器,判斷當前用戶是否指定角色

org.apache.shiro.web.filter.authz.RolesAuthorizationFilter

ssl

請求須要經過ssl,若是不是跳轉到登錄頁

org.apache.shiro.web.filter.authz.SslFilter

user

若是訪問一個已知用戶,好比記住個人功能,走這個過濾器

org.apache.shiro.web.filter.authc.UserFilter

10.5       記住我和已認證何時用?

這通常是應用於電子商務網站中,舉個例子:好比你正在訪問亞馬遜,你弄了幾本書放到了購物車中,當你正要結帳的時候,你忽然有些事情不得不出去一下,結果你回來時候已經到了下班時間了,結果你就關機下班回家了,當你到家的時候你忽然想起來還有幾本書沒有完成付款,結果你打開網站要繼續完成支付時你發現網站中還記錄着你是誰,你看到了歡迎頁面,可是當你要確認支付訪問你的信用卡帳戶信息時,網站會強制讓你再次輸入密碼,已達到已認證的狀態,由於亞馬遜網站只記得你是誰,可是那並不能證實你就是你,也多是你的同事或者陌生人在使用你的電腦。

記住我和已認證必定是互斥的,一個爲真則另外一個確定爲假!

相關文章
相關標籤/搜索