亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于Spring Security的權(quán)限管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

        2024-01-14 09:54:26蘇兵
        電腦與電信 2023年9期
        關(guān)鍵詞:菜單按鈕分配

        蘇兵

        (廣東培正學(xué)院數(shù)據(jù)科學(xué)與計(jì)算機(jī)學(xué)院,廣東 廣州 510830)

        1 引言

        計(jì)算機(jī)技術(shù)日新月異,為了對(duì)特定的網(wǎng)絡(luò)資源進(jìn)行有效的保護(hù),需要對(duì)任何投入運(yùn)營(yíng)的信息系統(tǒng)增加更高的安全模塊,如身份驗(yàn)證、授權(quán)和加密方式等,從而防止數(shù)據(jù)泄露等問(wèn)題[1]。在未使用安全框架之前,開(kāi)發(fā)者需要手動(dòng)地處理每個(gè)資源的訪(fǎng)問(wèn)控制,然而,針對(duì)不同的開(kāi)發(fā)項(xiàng)目,又往往需要做出不同的處理,使得整個(gè)工程操作起來(lái)非常繁瑣且低效率,進(jìn)而引起更多額外的開(kāi)銷(xiāo),導(dǎo)致延緩開(kāi)發(fā)周期,增加開(kāi)發(fā)成本。使用Spring Security與JWT,開(kāi)發(fā)者可通過(guò)配置的方式實(shí)現(xiàn)對(duì)特定資源的訪(fǎng)問(wèn)限制,用戶(hù)信息在各方傳輸時(shí),通過(guò)JWT對(duì)數(shù)據(jù)加密后形成token,用來(lái)進(jìn)行用戶(hù)認(rèn)證,確保用戶(hù)的合法性[2-3]。該信息安全解決方案開(kāi)發(fā)更加高效,且復(fù)用性高、維護(hù)開(kāi)本低,深受?chē)?guó)內(nèi)外知名互聯(lián)網(wǎng)公司青睞。

        2 系統(tǒng)的整體設(shè)計(jì)

        該權(quán)限管理系統(tǒng)有三類(lèi)服務(wù)器:Web 服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器和緩存服務(wù)器,客戶(hù)端為PC 端和移動(dòng)端,如圖1 所示。Web 服務(wù)器后端采用微服務(wù)架構(gòu),關(guān)鍵技術(shù)為Spring Boot、MyBatis-plus、Spring Security 和JWT,緩存服務(wù)器采用Redis 高速緩存技術(shù),數(shù)據(jù)庫(kù)服務(wù)器采用關(guān)系型數(shù)據(jù)庫(kù)MySQL,前端采用Vue.js和Element-Plus等技術(shù)。

        圖1 系統(tǒng)的整體設(shè)計(jì)

        本文論述的重點(diǎn)是在Web服務(wù)器中應(yīng)用Spring Security的功能,從而更好地保護(hù)Web 服務(wù)器的資源,以免被非法訪(fǎng)問(wèn)或攻擊。基于對(duì)保護(hù)命令方式或反應(yīng)式應(yīng)用程序的有效支持,Spring Security可以作為一種提供身份驗(yàn)證、授權(quán)及防范攻擊的功能性框架,更是作為保護(hù)基于Spring所開(kāi)發(fā)應(yīng)用程序的一種常用標(biāo)準(zhǔn)[4]。通過(guò)對(duì)Spring Security 的規(guī)范應(yīng)用,進(jìn)而使開(kāi)發(fā)者更自如地實(shí)現(xiàn)對(duì)安全功能的標(biāo)準(zhǔn)集成,例如:對(duì)用戶(hù)角色的權(quán)限管理,以此達(dá)到保護(hù)應(yīng)用程序免遭嚴(yán)重攻擊和非法訪(fǎng)問(wèn)的目的。下面對(duì)Web服務(wù)器中的Spring-Security安全組件進(jìn)行分析:

        (1)AuthenticationManager:負(fù)責(zé)認(rèn)證管理,解析用戶(hù)登錄信息(封裝在Authentication),讀取用戶(hù)、角色、權(quán)限信息進(jìn)行認(rèn)證,認(rèn)證結(jié)果被回填到Authentication,保存在Securi-tyContext。

        (2)AccessDecisionManager:負(fù)責(zé)授權(quán)投票表決,匯總投票器的結(jié)果,實(shí)現(xiàn)一票通過(guò)(默認(rèn))、多票通過(guò)、一票否決策略。

        (3)SecurityInterceptor:負(fù)責(zé)權(quán)限攔截,包括Web URL攔截和方法調(diào)用攔截。通過(guò)ConfigAttributes 獲取資源的描述信息,借助于AccessDecisionManager進(jìn)行授權(quán)攔截。

        (4)SecurityContext:安全上下文,保存認(rèn)證結(jié)果。提供了全局上下文、線(xiàn)程繼承上下文、線(xiàn)程獨(dú)立上下文(默認(rèn))三種策略。

        (5)Authentication:認(rèn)證信息,保存用戶(hù)的身份標(biāo)示、權(quán)限列表、證書(shū)、認(rèn)證通過(guò)標(biāo)記等信息。

        (6)SecuredResource:被安全管控的資源,如Web URL、用戶(hù)、角色、自定義領(lǐng)域?qū)ο蟮取?/p>

        (7)ConfigAttributes:資源屬性配置,描述安全管控資源的信息,為SecurityInterceptor提供攔截邏輯的輸入。

        JSON Web Token(JWT)是一個(gè)開(kāi)放式的標(biāo)準(zhǔn)(RFC 7519),其定義了一種緊湊且自包含的方式,用于作為JSON對(duì)象在各程序之間安全可靠地傳輸信息,該信息因經(jīng)過(guò)數(shù)字簽名,故可實(shí)現(xiàn)有效驗(yàn)證與事物的可信任性[5]。本系統(tǒng)采用JWT技術(shù)對(duì)用戶(hù)信息進(jìn)行加密處理,提高數(shù)據(jù)的安全性。為了實(shí)現(xiàn)前后端分離的設(shè)計(jì)模式,系統(tǒng)的前端在node.js運(yùn)行環(huán)境下開(kāi)發(fā),后端則采用主流微服務(wù)架構(gòu)。當(dāng)用戶(hù)通過(guò)客戶(hù)端登錄系統(tǒng)時(shí),系統(tǒng)將會(huì)自動(dòng)啟動(dòng)Spring Security 對(duì)用戶(hù)的身份進(jìn)行認(rèn)證,當(dāng)身份認(rèn)證成功后,再通過(guò)JWT對(duì)用戶(hù)加密后形成token,用戶(hù)請(qǐng)求其他資源時(shí)只需攜帶token 即可,后端會(huì)通過(guò)token來(lái)識(shí)別用戶(hù)身份。

        3 基于角色的權(quán)限管理設(shè)計(jì)

        本系統(tǒng)的數(shù)據(jù)庫(kù)設(shè)計(jì)采用基于角色的訪(fǎng)問(wèn)控制模型(RBAC),在微服務(wù)架構(gòu)下應(yīng)用MyBatis-plus 框架嵌入到Spring Security 安全框架中,通過(guò)這種方式可以將用戶(hù)關(guān)聯(lián)角色,角色關(guān)聯(lián)權(quán)限,從而間接地實(shí)現(xiàn)賦予用戶(hù)相應(yīng)的權(quán)限。如圖2 所示,本系統(tǒng)的RBAC 模塊由三部分組成:用戶(hù)管理、角色管理和權(quán)限管理。

        圖2 RBAC模塊功能

        針對(duì)RBAC 模塊功能,本系統(tǒng)數(shù)據(jù)庫(kù)需設(shè)計(jì)5 張表:用戶(hù)表、角色表、菜單表、用戶(hù)角色中間表和角色菜單中間表。如圖3 所示,用戶(hù)表主要用于存儲(chǔ)用戶(hù)身份信息;角色表主要用于存儲(chǔ)用戶(hù)的角色信息;菜單表主要用于實(shí)現(xiàn)存儲(chǔ)用戶(hù)顯示的菜單和擁有的權(quán)限,主要包括菜單名、訪(fǎng)問(wèn)權(quán)限和訪(fǎng)問(wèn)接口等字段;用戶(hù)和角色中間表功能主要用于實(shí)現(xiàn)能將用戶(hù)與角色關(guān)聯(lián)起來(lái),實(shí)現(xiàn)用戶(hù)與角色多對(duì)多的關(guān)系;角色和菜單中間表主要用于定義某個(gè)角色可以訪(fǎng)問(wèn)哪些菜單。由于本系統(tǒng)采用Mybatis-plus 框架來(lái)關(guān)聯(lián)Web 應(yīng)用與數(shù)據(jù)庫(kù)實(shí)現(xiàn)CRUD 操作,無(wú)需在數(shù)據(jù)庫(kù)的表設(shè)計(jì)中添加外鍵,Mybatis-plus 默認(rèn)使用生成ID,在項(xiàng)目的配置文件中配置即可。

        圖3 數(shù)據(jù)庫(kù)物理模型

        4 權(quán)限管理核心功能的實(shí)現(xiàn)

        該權(quán)限管理系統(tǒng)將論述前端和后端的核心功能的實(shí)現(xiàn)過(guò)程。前端核心功能則是采用Vue.js 與Element-Plus 等技術(shù)簡(jiǎn)化UI 開(kāi)發(fā)工作。Vue 基于標(biāo)準(zhǔn)HTML、CSS 和JavaScript 構(gòu)建,并提供了一套聲明式的、組件化的編程模型,幫助開(kāi)發(fā)者高效地開(kāi)發(fā)用戶(hù)界面[6]。Element-Plus 是一個(gè)基于Vue.js 的企業(yè)級(jí)UI 組件庫(kù),它包含了很多常用的UI 組件,如表格、表單、按鈕、彈框等,可大大簡(jiǎn)化UI 開(kāi)發(fā)工作。后端核心功能是采用Spring Security 與JWT 等技術(shù)實(shí)現(xiàn)對(duì)特定資源的訪(fǎng)問(wèn),充分應(yīng)用Spring Security 的認(rèn)證和授權(quán)功能。后端核心功能類(lèi)分別保存在配置包c(diǎn)onfig 和控制器包c(diǎn)ontroller中,如圖4所示。

        圖4 后端核心功能類(lèi)

        4.1 身份認(rèn)證的實(shí)現(xiàn)

        4.1.1 身份認(rèn)證前端的實(shí)現(xiàn)

        身份認(rèn)證之前需先通過(guò)表單收集登錄用戶(hù)的用戶(hù)名和密碼,如圖5 所示,當(dāng)用戶(hù)輸入完用戶(hù)名和密碼后,還需在“驗(yàn)證碼”輸入框輸入其右邊隨機(jī)產(chǎn)生的字母圖形碼,防御通過(guò)機(jī)器人高頻率地訪(fǎng)問(wèn)服務(wù)器,同時(shí)也可勾選表單左下角的“記住密碼”單選框?qū)Ξ?dāng)前密碼進(jìn)行保存,方便下次登錄系統(tǒng)。若輸入的信息都正確,點(diǎn)擊“登錄”按鈕即可成功登錄系統(tǒng)。

        圖5 系統(tǒng)登錄頁(yè)面

        “登錄”按鈕的功能是該登錄頁(yè)面的核心功能,關(guān)鍵的javascript代碼如下所示:

        用戶(hù)成功登錄后會(huì)在瀏覽器的會(huì)話(huà)存儲(chǔ)器中保存相應(yīng)的數(shù)據(jù),特別是token,如圖6所示。

        圖6 會(huì)話(huà)存儲(chǔ)器中保存的數(shù)據(jù)

        4.1.2 身份認(rèn)證后端的實(shí)現(xiàn)

        后端采用Spring Security 對(duì)用戶(hù)身份進(jìn)行認(rèn)證,其認(rèn)證功能是驗(yàn)證試圖要訪(fǎng)問(wèn)特定資源的人的身份,而授權(quán)則是用來(lái)確定允許誰(shuí)可以訪(fǎng)問(wèn)特定的資源的作用。Spring Security 的深度防御措施則可以通過(guò)允許基于請(qǐng)求的授權(quán)和基于方法的授權(quán)來(lái)實(shí)現(xiàn)這一功能。

        (1)用戶(hù)身份認(rèn)證環(huán)節(jié)的實(shí)現(xiàn)過(guò)程:當(dāng)用戶(hù)登錄成功后,Web 服務(wù)器會(huì)根據(jù)設(shè)定的算法和JWT 的結(jié)構(gòu)生成一個(gè)token,并將該token 返回給客戶(hù)端,此時(shí),token 將存儲(chǔ)在緩存服務(wù)器中。接下來(lái),客戶(hù)端接收到信息,再根據(jù)Web 服務(wù)器來(lái)實(shí)現(xiàn)返回該用戶(hù)所能訪(fǎng)問(wèn)的前端菜單的動(dòng)態(tài)加載頁(yè)面,從而實(shí)現(xiàn)為不同角色顯示不同的頁(yè)面效果的功能。當(dāng)用戶(hù)進(jìn)行第二次登錄時(shí),只需要帶上上一次服務(wù)器所返回的token 即可,無(wú)需再次進(jìn)行賬號(hào)和密碼的驗(yàn)證。也就是說(shuō),系統(tǒng)此時(shí)只需要從用戶(hù)提交的token當(dāng)中去獲取該用戶(hù)的用戶(hù)名,然后再?gòu)腞edis服務(wù)器中通過(guò)這個(gè)用戶(hù)名拿到一個(gè)token。如果此時(shí)的token相同,則開(kāi)始檢驗(yàn)該token是否過(guò)期,如果已經(jīng)過(guò)期則會(huì)重新生成一個(gè)新的token。下面將通過(guò)2個(gè)類(lèi)的部分功能來(lái)論證用戶(hù)身份的認(rèn)證過(guò)程。

        控制層的“SysUserController.java”用戶(hù)控制器類(lèi)主要實(shí)現(xiàn)對(duì)用戶(hù)名進(jìn)行驗(yàn)證,代碼及其關(guān)鍵注釋如下:

        (2)對(duì)特定資源訪(fǎng)問(wèn)授權(quán)的實(shí)現(xiàn)過(guò)程:當(dāng)用戶(hù)成功登錄后,需要對(duì)其他的頁(yè)面或資源進(jìn)行訪(fǎng)問(wèn),但由于token中包含了用戶(hù)的基本信息和所能訪(fǎng)問(wèn)的資源,因此每次進(jìn)行資源訪(fǎng)問(wèn)時(shí),用戶(hù)也只需要帶上token即可。用戶(hù)可以通過(guò)token獲取來(lái)用戶(hù)名,再通過(guò)用戶(hù)名訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),進(jìn)而查詢(xún)?cè)撚脩?hù)是否有訪(fǎng)問(wèn)該API資源的權(quán)限,如果該用戶(hù)擁有訪(fǎng)問(wèn)該資源的權(quán)限,就繼續(xù)正常往下執(zhí)行,否則將返回?zé)o權(quán)訪(fǎng)問(wèn)的提示。

        當(dāng)用戶(hù)成功通過(guò)Spring Security 安全框架的認(rèn)證和授權(quán),程序的業(yè)務(wù)邏輯層會(huì)根據(jù)用戶(hù)ID 獲取用戶(hù)權(quán)限信息,代碼如下所示,程序運(yùn)行時(shí)從控制臺(tái)輸出所獲權(quán)限結(jié)果,如圖7所示。

        圖7 控制臺(tái)輸出所獲權(quán)限結(jié)果

        4.2 對(duì)用戶(hù)分配角色的實(shí)現(xiàn)

        4.2.1 分配角色前端的實(shí)現(xiàn)

        當(dāng)?shù)卿浻脩?hù)的身份通過(guò)驗(yàn)證后即可進(jìn)入到系統(tǒng)的首頁(yè)。用戶(hù)通過(guò)點(diǎn)擊左側(cè)菜單“用戶(hù)管理”進(jìn)入用戶(hù)管理頁(yè)面,該頁(yè)面的功能非常豐富,如搜索用戶(hù)信息、新增用戶(hù)和對(duì)用戶(hù)進(jìn)行分配角色等,如圖8所示。

        圖8 用戶(hù)管理界面

        由于用戶(hù)需求的改變,要求將test02 用戶(hù)增加“普遍角色”。為了實(shí)現(xiàn)該功能,需點(diǎn)擊“分配角色”按鈕,便彈出如圖9 所示的對(duì)話(huà)框,當(dāng)選擇完所需角色后,點(diǎn)擊“確定”按鈕即可實(shí)現(xiàn)。該按鈕核心的javascript代碼和注釋如下:

        圖9 對(duì)指定用戶(hù)分配角色1

        如圖10 所示為成功地對(duì)test02 用戶(hù)分配角色后的前面效果。

        圖10 指定用戶(hù)分配角色2

        4.2.2 分配角色后端的實(shí)現(xiàn)

        對(duì)指定用戶(hù)分配角色主要在系統(tǒng)用戶(hù)控制類(lèi)“SysUser-Controller.java”的grantRole()方法上實(shí)現(xiàn),如下代碼所示,需同時(shí)對(duì)該方法添加3 個(gè)注釋?zhuān)簡(jiǎn)⒂脭?shù)據(jù)庫(kù)事務(wù)處理的@Transactional;提交數(shù)據(jù)的影射@PostMapping,其路徑參數(shù)中采用RESTful 架構(gòu)來(lái)傳遞userId;@PreAuthorize 為用前授權(quán)判斷,要求訪(fǎng)問(wèn)該方法前必須擁有訪(fǎng)問(wèn)角色的權(quán)限。

        4.3 對(duì)角色權(quán)限分配的實(shí)現(xiàn)

        4.3.1 對(duì)角色權(quán)限分配前端的實(shí)現(xiàn)

        對(duì)于權(quán)限管理系統(tǒng),給指定的角色進(jìn)行權(quán)限分配顯得非常重要功能之一。當(dāng)在“角色管理”頁(yè)面中點(diǎn)擊“普通角色”的“分配權(quán)限”按鈕后,便彈出如圖11 所示的“分配權(quán)限”對(duì)話(huà)框,從中查看到“普通角色”的權(quán)限比較少,僅有對(duì)用戶(hù)和角色進(jìn)行查詢(xún),及訪(fǎng)問(wèn)業(yè)務(wù)的權(quán)限。根據(jù)系統(tǒng)功能需求,要對(duì)其添加權(quán)限:用戶(hù)新增、重置密碼和菜單查詢(xún),則勾選如圖12 所示的對(duì)話(huà)框,最后點(diǎn)擊“確認(rèn)”按鈕即可完成。“確認(rèn)”按鈕的javascript代碼和注釋如下:

        圖11 對(duì)角色分配權(quán)限前

        圖12 對(duì)角色分配權(quán)限后

        4.3.2 對(duì)角色權(quán)限分配后端的實(shí)現(xiàn)

        通過(guò)控制層的“SysRoleController.java”定義update-Menus()方法來(lái)處理前端提交的數(shù)據(jù),該方法能實(shí)現(xiàn)更新角色權(quán)限信息。由于該方法需對(duì)數(shù)據(jù)庫(kù)進(jìn)行寫(xiě)操作,為保證數(shù)據(jù)的原子性,給該方法添加事務(wù)處理注解@Transactional,同時(shí)在所請(qǐng)求的url 中采用了RESTful 架構(gòu),方便對(duì)處理前端傳來(lái)的數(shù)據(jù)。以下為對(duì)角色權(quán)限分配實(shí)現(xiàn)的Java代碼:

        4.4 對(duì)菜單配置權(quán)限的實(shí)現(xiàn)

        4.4.1 對(duì)菜單配置權(quán)限前端的實(shí)現(xiàn)

        為菜單配置相應(yīng)的權(quán)限是本系統(tǒng)的核心功能之一,先前的功能必須獲取相應(yīng)的權(quán)限才能執(zhí)行。下面將論述為“用戶(hù)管理”新建權(quán)限分配的前端實(shí)現(xiàn)。當(dāng)進(jìn)入“權(quán)限管理”頁(yè)面后,系統(tǒng)將查詢(xún)出各級(jí)“菜單名稱(chēng)”的“權(quán)限標(biāo)識(shí)”等信息,現(xiàn)需為“用戶(hù)管理”新建一個(gè)用于“test 用戶(hù)查詢(xún)”的權(quán)限“system:user:query”,如圖13所示,點(diǎn)擊“確認(rèn)”按鈕后,成功地完成其權(quán)限的新建,如圖14所示?!按_認(rèn)”按鈕的javascript代碼和注釋如下:

        圖13 權(quán)限分配中

        圖14 權(quán)限分配后

        4.4.2 對(duì)菜單配置權(quán)限后端的實(shí)現(xiàn)

        后端為了響應(yīng)前端對(duì)菜單添加或者修改權(quán)限的操作,需在控制層的“SysMenuController.java”類(lèi)中定義save()方法來(lái)保存該操作的結(jié)果。該方法需添加2 個(gè)注解:用于url路由的@PostMapping;使用方法前需獲取添加和編輯的權(quán)限@PreAuthorize。該方法接收的“SysRole”對(duì)象前需添加2 個(gè)注解:@RequestBoday 表示該對(duì)象應(yīng)該綁定到web 請(qǐng)求的主體;@Valid 表示標(biāo)記用于級(jí)聯(lián)驗(yàn)證的屬性、方法參數(shù)或方法返回類(lèi)型。對(duì)菜單進(jìn)行權(quán)限分配的核心Java 代碼和注釋如下:

        5 結(jié)語(yǔ)

        本系統(tǒng)基于Spring Security 安全框架搭建了一套安全可靠的權(quán)限管理系統(tǒng),系統(tǒng)的實(shí)現(xiàn)采用了RBAC 模型、Mybatis-plus 框架和JWT 等技術(shù),并結(jié)合Vue.js 和Element-Plus 等技術(shù)實(shí)現(xiàn)系統(tǒng)的前后端分離功能設(shè)計(jì)。本系統(tǒng)應(yīng)用了微服務(wù)構(gòu)架設(shè)計(jì),減輕了后端服務(wù)器的運(yùn)算速度,降低了數(shù)據(jù)存儲(chǔ)產(chǎn)生的壓力,同時(shí),對(duì)外來(lái)的非法訪(fǎng)問(wèn)攻擊產(chǎn)生防范作用,為信息系統(tǒng)實(shí)現(xiàn)了可靠的安全認(rèn)證與授權(quán)管理等功能,更便于后續(xù)的移植與維護(hù)。

        猜你喜歡
        菜單按鈕分配
        哪個(gè)是門(mén)鈴真正的按鈕
        當(dāng)你面前有個(gè)按鈕
        中國(guó)新年菜單
        應(yīng)答器THR和TFFR分配及SIL等級(jí)探討
        遺產(chǎn)的分配
        一種分配十分不均的財(cái)富
        績(jī)效考核分配的實(shí)踐與思考
        死循環(huán)
        本月菜單
        美食堂(2017年1期)2017-01-13 01:37:42
        內(nèi)心不能碰的按鈕
        亚洲色图少妇熟女偷拍自拍 | 亚洲精品乱码久久久久久久久久久久| 国产91中文| 成年人视频在线播放视频| 中文字幕在线乱码av| 永久免费人禽av在线观看| 国产又黄又猛又粗又爽的a片动漫| 亚州AV成人无码久久精品| av在线一区二区三区不卡| 隔壁老王国产在线精品| 在线观看国产成人av片| 亚洲欧洲日韩另类自拍| 免费人成在线观看播放视频| 亚洲色图片区| 97影院在线午夜| 无码啪啪人妻| 少妇被按摩出高潮了一区二区| 国产又粗又猛又黄又爽无遮挡| 极品熟妇大蝴蝶20p| 久青青草视频手机在线免费观看| 亚洲国产精品婷婷久久| 少妇仑乱a毛片| 国产免费一级在线观看| 麻豆成人久久精品二区三区91| 国产av无码专区亚洲av男同 | 国产一区二区精品久久岳| 国产剧情麻豆女教师在线观看| 欧美zozo另类人禽交| 成人一区二区三区国产| 亚洲人成色7777在线观看| 国产精品第1页在线观看 | 麻豆精品一区二区三区| 免费看黑人男阳茎进女阳道视频| 最新国产三级| 久久精品亚洲乱码伦伦中文| 欧美精品欧美人与动人物牲交| 久久久久国产一区二区三区 | 无码AV高潮喷水无码专区线| 久久精品国产亚洲av调教| 日韩精品无码一区二区三区| 依依成人精品视频在线观看|