Shiro的authc過濾器的執行流程

2021-09-25 17:19:57 字數 3776 閱讀 1231

1.先執行isaccessallowed(),通過subject.isauthenticated()判斷當前session中的subject是否已經登陸過。如果在當前session即會話中已經登陸過,返回true,authc過濾器放行請求到loginurl。

問題?

這裡會有乙個問題,如果我登陸成功後,再次訪問loginurl,會執行isaccessallowed()並返回true放行,那麼我訪問到了loginurl,如果此時我在loginurl中輸入新的使用者名稱密碼,再提交則先執行isaccessallowed(),因為當前session中的subject是已經登陸過的,isaccessallowed()返回true,autch放行,請求又會到loginurl。因為在登陸的情況下,再訪問loginurl則isaccessallowed()始終返回true,不會執行到onaccessdenied()方法,即不會驗證請求中的新的使用者名稱和密碼。

2.如果isaccessallowed()是false即拒絕訪問後執行onaccessdenied()方法:

2.1判斷是否是登陸請請求(即request中的url和我們設定的loginurl是否一致)

2.1.1如果請求的url和我們在配置檔案中設定的loginurl一樣

2.1.1.1如果是get請求,則返回true,即該過濾器連放行,讓請求訪問到loginurl

2.1.1.2如果是post請求,則建立subjet和tocken 呼叫subject的login方法進行認證(即開始執行realm的dogetauthenticationinfo方法)

2.1.1.2.1如果認證成功則會返回false阻止filterchain繼續執行即不讓請求達到loginurl,而是在這裡直接重定向我們上次訪問的非logurl的請求位址去(這個請求位址在你訪問的時候已經被儲存到session中了)如果沒有上次訪問的位址,則到我們設定的successurl

2.1.1…2.2如果認證失敗則會返回true,將認證失敗的異常資訊放到reqeust屬性中,即放行讓fliterchain繼續執行,讓請求達到loginurl。

2.2如果否即request中的url不是loginurl,則儲存請求(應該是到session裡),再將請求重定向到loginurl(瀏覽器又會訪問通過get方法訪問loginurl,又會被authc攔截,再重複上面流程,此時是登陸請求且是get請求則authc會放行訪問到loginurl),執行完重定向後返回false阻止filterchain繼續執行。

綜上所述:

只有以下四種情況會到loginurl:

//1.還沒有登陸成功的情況下:get請求我們在配置檔案中設定的loginurl,authc會放行請求到這裡

//2.還沒有登陸成功的情況下:post請求我們在配置檔案中設定的loginurl,authc在認證失敗後會讓瀏覽器重定向到這裡

//3.還沒有登陸成功的情況下:請求(不管post還是get)的頁面不是loginurl且需要authc過濾,那麼authc也會讓瀏覽器重定向到這裡

//4.登陸成功後,瀏覽器再次訪問loginurl(不管post或get),authc也會放行到這裡。

怎麼解決上面登陸成功後再訪問loginurl,不會執行新使用者認證的問題呢?只有重寫authc過濾器的isaccessallowed()方法

public

class

myauthcfilter

extends

formauthenticationfilter

//如果是其他請求 則執行父類的方法

return

super

.isaccessallowed;}

}

最後再配置檔案中註冊該類,覆蓋掉shiro原本的過濾器formauthenticationfilter:

"shirofilter"

class

="org.apache.shiro.spring.web.shirofilte***ctorybean"

>

name

="securitymanager"

ref="securitymanager"

/>

name

="loginurl"

value

="/login"

/>

name

="successurl"

value

="/index.jsp"

/>

name

="unauthorizedurl"

value

="/unauthorized.jsp"

/>

name

="filters"

>

>

key=

"authc"

value-ref

="myauthcfilter"

/>

map>

property

>

name

="filterchaindefinitions"

>

>

# some example chain definitions:

/login = authc

/logout = logout

/1.jsp = user

/** = authc

# more url-to-filterchain definitions here

value

>

property

>

bean

>

login的寫法:

@controller

public

class

userscontroller

else

if(incorrectcredential***ception.

class

.getname()

.equals

(errorclassname)

)else

if(errorclassname != null)

return

"login.jsp";}

}

session和cookie:

通過瀏覽器第一次傳送http請求時,伺服器會建立乙個session和cookie(cookie中儲存sessionid),這個session伺服器的預設時間30分鐘,可以設定。服務第一次響應時也把cookie放到響應中給瀏覽器,瀏覽器

收到cookie後,會判斷cookie有沒有設定過期時間,如果沒有則只儲存在記憶體中。如果有則存到硬碟裡。

如果只是儲存到記憶體中,伺服器端的session依然會保留30分鐘。那麼瀏覽器一關閉,cookie消失,sessionid也消失了。。但此時開啟瀏覽器再訪問伺服器時,雖然伺服器的session依然存在,但瀏覽器中的cookie(sessionid)消失了

瀏覽器傳送的請求頭里沒有cookie(沒有sessionid),伺服器會當作乙個新的請求,會再建立乙個新session。伺服器中的之前的session 30分鐘侯清除。

如果儲存到硬碟裡了, 伺服器端的session依然會保留30分鐘。那麼關閉瀏覽器後,再開啟瀏覽器訪問伺服器時,瀏覽器會找到存到硬碟裡的cookie(sessionid), 瀏覽器再次請求伺服器時會帶上cookie,伺服器收到請求後發現有cookie(sessionid)並且伺服器

端的session也存在。那麼伺服器就依然會使用之前的session。不會再建立乙個新的session。

所以session預設關閉瀏覽器就失效了。

shiro內建過濾器

rest 例子 admins user rest user 根據請求的方法,相當於 admins user perms user method 其中method為post,get,delete等。port 例子 admins user port 8081 當請求的url的埠不是8081是跳轉到sch...

shiro過濾器名稱

功 能配 置 anon 任何使用者傳送的請求都能夠訪問 authc 經過認證的請求可訪問,否則將會將請求重定向到 ini 配置檔案配置的 authc.loginurl 資源,進行認證操作 authc.loginurl login.jsp authc.successurl 認證成功後重定向到此資源 a...

Shiro內建過濾器

執行 web 應用時,shiro會建立一些有用的預設 filter 例項,並自動地在 main 項中將它們置為可用 這些可用的預設的 filter 例項是被 defaultfilter 列舉類定義的 列舉的名稱字段就是可供配置的名稱 這些過濾器分為兩組 u 認證過濾器 anon 不認證也可以訪問 a...