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