新聞中心
本人野生程序員一名,了解了一些微服務(wù)架構(gòu)、前后端分離、SPA的知識(shí)后就想試試做點(diǎn)什么東西。之前一直做后端,前端只是有基礎(chǔ)知識(shí)。之前學(xué)習(xí)過angularjs,但當(dāng)時(shí)就是一臉懵逼(完全看不懂是啥)就放棄了。最近又學(xué)了Vue,這次感覺總算明白了一些,但其中也跳過很多坑(應(yīng)該還會(huì)更多),在這里寫下來記錄一下吧。
說回主題,之前傳統(tǒng)登錄認(rèn)證的方法基本是由服務(wù)器端提供一個(gè)登錄頁面,頁面中的一個(gè)form輸入username和password后POST給服務(wù)器,服務(wù)器將這些信息與DB或Ldap中的用戶信息對(duì)比,成功則將這個(gè)用戶信息記錄到session中。
這里我就跳了第一個(gè)大坑。傳統(tǒng)方式前后端不分離,后端負(fù)責(zé)頁面渲染,但是在前后分離的情況下,后端只負(fù)責(zé)通過暴露的RestApi提供數(shù)據(jù),而頁面的渲染、路由都由前端完成。因?yàn)閞est是無狀態(tài)的,因此也就不會(huì)有session記錄到服務(wù)器端。
之前一直使用SpringSecurity+Cas+Ldap來做SSO,但是使用Vue做前端后我怎都想不出用之前的方法做SSO(這個(gè)坑真的爬了好久才爬出來)。后來終于想明白了上面說的session的問題(我是這么認(rèn)為的也可能不對(duì),CAS也有RestApi,但是按官網(wǎng)配置沒成功,放棄了)。
第一個(gè)問題,該如何解決SSO的問題呢,要說到JWT。JWT是個(gè)規(guī)范,各種語言有各種語言的實(shí)現(xiàn),可以去官網(wǎng)查到。我淺薄的理解是有一個(gè)認(rèn)證服務(wù)(你自己寫的,Db、Ldap什么都可以)這個(gè)認(rèn)證服務(wù)會(huì)通過用戶的提交信息判斷認(rèn)證是否成功,如果成功則查詢出一些用戶的信息(用戶名、角色什么的),然后JWT把這些信息加密成為一個(gè)token,返回給客戶端瀏覽器,瀏覽器把這些信息存儲(chǔ)在localstorage中,以后每次訪問資源都會(huì)在header中攜帶這個(gè)信息,服務(wù)器收到請(qǐng)求后使用和加密時(shí)相同的key解密密文,如果解密成功則視為用戶已經(jīng)認(rèn)證過(當(dāng)然你可以在加密時(shí)添加以一個(gè)過期時(shí)間)也就完成了SSO。使用解密出的角色信息你就可以判斷這個(gè)用戶是否有權(quán)限執(zhí)行一些業(yè)務(wù)。這樣做完后感覺好像SpringSecurity、Cas在SPA應(yīng)用中的SSO似乎沒什么作用了,目前我是這么認(rèn)為的(當(dāng)然可能不對(duì))
第一個(gè)問題差不多解決了,來說第二個(gè)問題。之前因?yàn)橛衧ession的存在,在訪問受保護(hù)的資源時(shí)如果服務(wù)器端沒有當(dāng)前用戶的session,則會(huì)強(qiáng)制跳轉(zhuǎn)到登錄頁。那在前后分離的情況下要如何實(shí)現(xiàn)這個(gè)需求。思路是這樣的:利用Vue-Router的全局路由鉤子,在訪問任何頁面時(shí)先判斷l(xiāng)ocalStorage中是否存在JWT加密后的token并且token是否過期,如果存在且沒有過期則正常跳轉(zhuǎn)到請(qǐng)求的頁面,不存在或者過期則跳轉(zhuǎn)到登錄頁重新認(rèn)證。
思路說完了,上代碼
1.首先你需要一個(gè)Ldap,我使用的是AD。這里我建立了一個(gè)叫minibox.com的域,并且添加了一個(gè)Employees的OU,其中有2個(gè)子OU,子OU中創(chuàng)建了2個(gè)用戶。
在Groups中新建一些組,把之前創(chuàng)建的用戶加入到組中,這樣用戶就擁有了角色。
2.搭建SpringBoot環(huán)境
2.1pom文件
4.0.0 minibox an 0.0.1-SNAPSHOT org.springframework.boot spring-boot-starter-parent 1.5.1.RELEASE org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-hateoas org.springframework.boot spring-boot-devtools true io.jsonwebtoken jjwt 0.7.0 org.springframework.ldap spring-ldap-core 2.3.1.RELEASE com.alibaba fastjson 1.2.24 org.springframework.boot spring-boot-maven-plugin org.springframework.boot spring-boot-maven-plugin org.springframework springloaded 1.2.0.RELEASE
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)站題目:Vue+Jwt+SpringBoot+Ldap完成登錄認(rèn)證的示例代碼-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://www.dlmjj.cn/article/dggcee.html