Security為Spring自帶的權(quán)限框架怀估,相似的還有shiro损姜。該框架原理為過(guò)濾器攔截請(qǐng)求進(jìn)行處理条获。
用戶(hù)填入用戶(hù)名密碼后忠荞,與數(shù)據(jù)庫(kù)里存儲(chǔ)的用戶(hù)信息進(jìn)行比對(duì),如果通過(guò)帅掘,則認(rèn)證成功委煤。傳統(tǒng)的方法是在認(rèn)證通過(guò)后,創(chuàng)建sesstion修档,并給客戶(hù)端返回cookie碧绞。
現(xiàn)在我們采用JWT來(lái)處理用戶(hù)名密碼的認(rèn)證。區(qū)別在于吱窝,認(rèn)證通過(guò)后讥邻,服務(wù)器生成一個(gè)token,將token返回給客戶(hù)端院峡,客戶(hù)端以后的所有請(qǐng)求都需要在http頭中指定該token兴使。
服務(wù)器接收的請(qǐng)求后,會(huì)對(duì)token的合法性進(jìn)行驗(yàn)證照激。
驗(yàn)證的內(nèi)容包括:內(nèi)容是一個(gè)正確的JWT格式发魄、檢查簽名、檢查claims实抡、檢查權(quán)限欠母、處理登錄
具體實(shí)現(xiàn):
一、框架自帶
在Secrity的配置類(lèi)中,攔截“/login”請(qǐng)求吆寨,並添加兩個(gè)過(guò)濾器
創(chuàng)建一個(gè)類(lèi)JWTLoginFilter赏淌,核心功能是在驗(yàn)證用戶(hù)名密碼正確后,生成一個(gè)token啄清,并將token返回給客戶(hù)端:
該類(lèi)繼承自UsernamePasswordAuthenticationFilter六水,重寫(xiě)了其中的2個(gè)方法:
attemptAuthentication :接收并解析用戶(hù)憑證。(該類(lèi)繼承的父類(lèi)默認(rèn)的攔截請(qǐng)求為/login post)
successfulAuthentication :用戶(hù)成功登錄后辣卒,這個(gè)方法會(huì)被調(diào)用掷贾,我們?cè)谶@個(gè)方法里生成token。用戶(hù)一旦登錄成功后荣茫,會(huì)拿到token想帅,后續(xù)的請(qǐng)求都會(huì)帶著這個(gè)token,服務(wù)端會(huì)驗(yàn)證token的合法性啡莉。
創(chuàng)建Token的方法Jwts.builder()
創(chuàng)建JwtAuthenticationFilter類(lèi)港准,我們?cè)谶@個(gè)類(lèi)中實(shí)現(xiàn)token的校驗(yàn)功能旨剥。
該類(lèi)繼承自BasicAuthenticationFilter,在doFilterInternal方法中浅缸,從http頭的Authorization 項(xiàng)讀取token數(shù)據(jù)轨帜,然后用Jwts包提供的方法校驗(yàn)token的合法性。
解析Token的方法Jwts.parser()
如果校驗(yàn)通過(guò)衩椒,就認(rèn)為這是一個(gè)取得授權(quán)的合法請(qǐng)求蚌父。
二、自定義
在SecurityConfig的白名單中添加自定義的登陸請(qǐng)求
JWTAuthenticationFilter毛萌、JWTLoginFilter就不會(huì)攔截
三苟弛、Token驗(yàn)證
請(qǐng)求被Security的JWTAuthenticationFilter攔截