色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

求一種SaaS模式下多租戶系統(tǒng)數(shù)據(jù)隔離實現(xiàn)方案

jf_ro2CN3Fa ? 來源:稀土掘金 ? 2023-07-27 10:34 ? 次閱讀

1.背景

開發(fā)過SaaS系統(tǒng)平臺的小伙伴一定對多租戶這個概念不陌生,簡單來說一個租戶就是一個公司客戶,多個租戶共用同一個SaaS系統(tǒng),一旦SaaS系統(tǒng)不可用,那么所有的租戶都不可用。你可以這么理解SaaS系統(tǒng)就像一棟大樓,而租戶就是大樓里面租辦公樓層的公司,平時每家公司做著自己的業(yè)務,互不干擾,但是一旦大樓的電梯壞了,那么影響到的就是所有的公司。

多租戶問題,其是一種架構設計方式,就是在一臺或者一組服務器上運行的SaaS系統(tǒng),可以為多個租戶(客戶)提供服務,目的是為了讓多個租戶在互聯(lián)網(wǎng)環(huán)境下使用同一套程序,且保證租戶間的數(shù)據(jù)隔離。

從這種架構設計的模式上,不難看出來,多租戶架構的重點就是同一套程序下多個租戶數(shù)據(jù)的隔離。由于租戶數(shù)據(jù)是集中存儲的,所以要實現(xiàn)數(shù)據(jù)的安全性,就是看能否實現(xiàn)對租戶數(shù)據(jù)的隔離,防止租戶數(shù)據(jù)不經(jīng)意或被他人惡意地獲取和篡改。在講多租戶數(shù)據(jù)隔離實現(xiàn)之前,先來看看什么是SaaS系統(tǒng)。

什么是SaaS系統(tǒng) ?

SaaS平臺是運營saas軟件的平臺。SaaS提供商為企業(yè)搭建信息化所需要的所有網(wǎng)絡基礎設施及軟件、硬件運作平臺,并負責所有前期的實施、后期的維護等一系列服務,租戶(企業(yè))無需購買軟硬件、建設機房、招聘IT人員,即可通過互聯(lián)網(wǎng)使用信息系統(tǒng)。SaaS 是一種軟件布局模型,其應用專為網(wǎng)絡交付而設計,便于用戶通過互聯(lián)網(wǎng)托管、部署及接入。

簡單來說就是租戶給SaaS平臺付租金就能使用平臺提供的功能服務,當下比較典型就是各種云平臺、云服務廠商。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數(shù)據(jù)權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://github.com/YunaiV/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

2.多租戶數(shù)據(jù)隔離架構設計

目前saas多租戶系統(tǒng)的數(shù)據(jù)隔離有三種架構設計,即為每個租戶提供獨立的數(shù)據(jù)庫、獨立的表空間、按字段區(qū)分租戶,每種方案都有其各自的適用情況。

一個租戶獨立一個數(shù)據(jù)庫

一個租戶獨立使用一個數(shù)據(jù)庫,那就意味著我們的SaaS系統(tǒng)需要連接多個數(shù)據(jù)庫,這種實現(xiàn)方案其實就和分庫分表架構設計是一樣的,好處就是數(shù)據(jù)隔離級別高、安全性好,畢竟一個租戶單用一個數(shù)據(jù)庫,但是物理硬件成本,維護成本也變高了。

獨立的表空間

這種方案的實現(xiàn)方式,就是所有租戶共用一個數(shù)據(jù)庫系統(tǒng),但是每個租戶在數(shù)據(jù)庫系統(tǒng)中擁有一個獨立的表空間。

按租戶id字段隔離租戶

這種方案是多租戶方案中最簡單的數(shù)據(jù)隔離方法,即在每張表中都添加一個用于區(qū)分租戶的字段(如tenant_id或org_id啥的)來標識每條數(shù)據(jù)屬于哪個租戶,當進行查詢的時候每條語句都要添加該字段作為過濾條件,其特點是所有租戶的數(shù)據(jù)全都存放在同一個表中,數(shù)據(jù)的隔離性是最低的,完全是通過字段來區(qū)分的,很容易把數(shù)據(jù)搞串或者誤操作。

三種數(shù)據(jù)隔離架構設計的對比如下:

隔離方案 成本 支持租戶數(shù)量 優(yōu)點 缺點
獨立數(shù)據(jù)庫系統(tǒng) 數(shù)據(jù)隔離級別高,安全性,可以針對單個租戶開發(fā)個性化需求 數(shù)據(jù)庫獨立安裝,物理成本和維護成本都比較高
獨立的表空間 較多 提供了一定程度的邏輯數(shù)據(jù)隔離,一個數(shù)據(jù)庫系統(tǒng)可支持多個租戶 數(shù)據(jù)庫管理比較困難,表繁多,同時數(shù)據(jù)修復稍復雜
按租戶id字段區(qū)分 維護和購置成本最低,每個數(shù)據(jù)庫能夠支持的租戶數(shù)量最多 隔離級別最低,安全性也最低

大部分公司都是采用第三種:按租戶id字段隔離租戶 架構設計實現(xiàn)多租戶數(shù)據(jù)隔離的。接下來我們就來看看代碼層面怎么實現(xiàn)多租戶數(shù)據(jù)隔離的。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數(shù)據(jù)權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://github.com/YunaiV/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

3.mybatis-plus優(yōu)雅實現(xiàn)多租戶數(shù)據(jù)權限隔離

上面我們說過按租戶id字段隔離租戶 這種方式就是在獲取數(shù)據(jù)的時候?qū)γ恳粭lSQL語句添加租戶id作為過濾條件來隔離租戶數(shù)據(jù)的。但是這樣意味著每個查詢SQL都必須加上租戶id這個過濾條件,如果漏加就意味著會查詢出不同租戶的數(shù)據(jù),這是絕對不允許的,同時每個查詢接口都需要手動設置過濾條件,重復勞動,一點都不夠優(yōu)雅。這時候就不得不說說mybatis-plus的多租戶插件了,看看它如何優(yōu)雅實現(xiàn)多租戶隔離的?

再講述之前,我們先思考一下如何優(yōu)雅實現(xiàn)數(shù)據(jù)隔離?首先我們要求每一條SQL都加上租戶id這個過濾條件,這意味著我們需要解析原始SQL在合適的地方加上租戶id過濾條件,我們知道m(xù)ybatis提供擴展點就是攔截器,可以對SQL語句處理前后進行增強邏輯,分頁插件就是這么做的,所以我們這里要增強SQL自然也是這樣,接下來我們就來看看mybatis-plus多租戶插件是怎么實現(xiàn)多租戶數(shù)據(jù)隔離的。

該攔截器部分源碼如下:

publicclassTenantLineInnerInterceptorextendsJsqlParserSupportimplementsInnerInterceptor{
//多租戶處理器
privateTenantLineHandlertenantLineHandler;

//改SQL,添加多租戶id條件
publicvoidbeforeQuery(Executorexecutor,MappedStatementms,Objectparameter,RowBoundsrowBounds,ResultHandlerresultHandler,BoundSqlboundSql)throwsSQLException{
if(!InterceptorIgnoreHelper.willIgnoreTenantLine(ms.getId())){
MPBoundSqlmpBs=PluginUtils.mpBoundSql(boundSql);
mpBs.sql(this.parserSingle(mpBs.sql(),(Object)null));
}
}

publicvoidbeforePrepare(StatementHandlersh,Connectionconnection,IntegertransactionTimeout){
MPStatementHandlermpSh=PluginUtils.mpStatementHandler(sh);
MappedStatementms=mpSh.mappedStatement();
SqlCommandTypesct=ms.getSqlCommandType();
if(sct==SqlCommandType.INSERT||sct==SqlCommandType.UPDATE||sct==SqlCommandType.DELETE){
if(InterceptorIgnoreHelper.willIgnoreTenantLine(ms.getId())){
return;
}

MPBoundSqlmpBs=mpSh.mPBoundSql();
mpBs.sql(this.parserMulti(mpBs.sql(),(Object)null));
}

}

//礙于篇幅問題,下面省略的代碼就是繼承抽象類JsqlParserSupport解析SQL然后添加多租戶id條件的,可以自行查看源碼
......
}

接著我們來看看處理器TenantLineHandler,這是一個接口,需要我們提供自定義實現(xiàn),指定多租戶相關配置:

publicclassTenantDatabaseHandlerimplementsTenantLineHandler{
privatefinalSetignoreTables=newHashSet<>();

publicTenantDatabaseHandler(TenantPropertiesproperties){
//將配置文件配置的忽略表名同步大小寫,適配不同寫法
properties.getIgnoreTables().forEach(table->{
ignoreTables.add(table.toLowerCase());
ignoreTables.add(table.toUpperCase());
});
}

/**
*獲取租戶字段名
*

*默認字段名叫:tenant_id,我這里使用org_id * *@return租戶字段名 */ @Override publicStringgetTenantIdColumn(){ return"org_id"; } @Override publicExpressiongetTenantId(){ //這里通過登錄信息上下文返回租戶id給多租戶攔截器增強SQL使用 returnnewLongValue(RequestUserHolder.getCurrentUser().getOrgId()); } @Override publicbooleanignoreTable(StringtableName){ //忽略多租戶的表 returnCollUtil.contains(ignoreTables,tableName); } }

配置屬性如下:

@ConfigurationProperties(prefix="ptc.tenant")
@Data
publicclassTenantProperties{


/**
*全局控制是否開啟多租戶功能
*/
privateBooleanenable=Boolean.TRUE;

/**
*需要忽略多租戶的表
*
*即默認所有表都開啟多租戶的功能,所以記得添加對應的tenant_id字段喲
*/
privateSetignoreTables=Collections.emptySet();
}

接下來注入攔截器插件即可:

@Bean
publicMybatisPlusInterceptormybatisPlusInterceptor(TenantPropertiesproperties){
MybatisPlusInterceptormybatisPlusInterceptor=newMybatisPlusInterceptor();
//必須保證多租戶插件在分頁插件之前,這個是MyBatis-plus的規(guī)定
if(properties.getEnable()){
mybatisPlusInterceptor.addInnerInterceptor(newTenantLineInnerInterceptor(newTenantDatabaseHandler(properties)));
}
//分頁插件
mybatisPlusInterceptor.addInnerInterceptor(newPaginationInnerInterceptor());
returnmybatisPlusInterceptor;
}

使用示例如下:這里提供了一個常見的案例:用戶和角色關聯(lián)查詢的SQL:getUserList()


selectu.*fromuseru
leftjoinuser_roleronu.id=r.user_id


andu.status=#{query.status}


andr.role_id=#{query.roleId}


and((u.namelikeconcat('%',#{query.keyword},'%'))or(u.mobilelikeconcat(#{query.keyword},'%')))


andu.entry_time>=#{query.startEntryTime}






groupbyu.id
orderbyu.iddesc

啟動項目,先登錄之后使用token掉接口執(zhí)行下面代碼邏輯:

publicPageResultgetList(UserQueryquery){
Pagepage=newPage<>(query.getPageNo(),query.getPageSize());
ListuserList=userDAO.getUserList(page,query);
ListuserDTOS=toUserDTOList(userList);
returnnewPageResult<>(userDTOS,page.getTotal(),page.getPages());
}

查看控制臺發(fā)現(xiàn):

[1658720355293990912][DEBUG][2023-05-1714:25:25.504][http-nio-16688-exec-1@23652]com.plasticene.textile.dao.UserDAO.getUserListdebug:==>Preparing:SELECTu.*FROMuseruLEFTJOINuser_rolerONu.id=r.user_idANDr.org_id=3WHEREu.org_id=3GROUPBYu.idORDERBYu.idDESCLIMIT?
[1658720355293990912][DEBUG][2023-05-1714:25:25.505][http-nio-16688-exec-1@23652]com.plasticene.textile.dao.UserDAO.getUserListdebug:==>Parameters:20(Long)

user表u加上u.org_id=3這個多租戶過濾條件,user_role也同樣加上了,說明多租戶插件起作用了。

當然如果想忽略掉表user,我們只需要在配置文件如下配置即可:

ptc:
tenant:
ignore-tables:user

這樣user表u就不會再加上u.org_id=3這個多租戶過濾條件,但是這里有一個細節(jié)需要注意,由于user在MySQL中是關鍵字,所以我有時候為了規(guī)范書寫SQL,會按照如下編寫:

selectu.*from`user`u
leftjoinuser_roleronu.id=r.user_id

這時候你會發(fā)現(xiàn)上面配置的忽略表user不起作用,還是會加上u.org_id=3這個多租戶過濾條件,跟源碼才發(fā)現(xiàn)我們上面自定義的多租戶處理器TenantLineHandler只對表名進行了大小寫適配,然而這里SQL解析出來的表名是: user ,所以匹配不到配置不起作用。

當然我們有可能需要針對單一SQL語句不加多租戶過濾條件,可以使用@InterceptorIgnore注解:

publicinterfaceUserDAOextendsBaseMapperX{

@InterceptorIgnore(tenantLine="true")
ListgetUserList(IPageuserPage,@Param("query")UserQueryquery);
}

這樣調(diào)用getUserList()不再會加多租戶過濾條件了。

通過上面我們知道了這個多租戶插件其實就是通過解析SQL,然后進行拼接多租戶id過濾條件來實現(xiàn)SQL增強從而做到數(shù)據(jù)隔離,解析SQL的框架叫:JSqlParser

官方文檔:

https://github.com/JSQLParser/JSqlParser/wiki

Druid也可以解析SQL,我們都知道SQL語句會生成語法樹,兩者對SQL解析的孰強孰弱(特別是復雜SQL)不得而知,可以自行驗證對比,我這里給出一個JSqlParser解析出錯的情況,把上面的SQL語句user_role r 改為 user_role ur

selectu.*fromuseru
leftjoinuser_roleuronu.id=ur.user_id

按照上面一樣調(diào)用執(zhí)行getUserList(), 會報解析錯誤:

Causedby:com.baomidou.mybatisplus.core.exceptions.MybatisPlusException:Failedtoprocess,ErrorSQL:selectu.*fromuseru
leftjoinuser_roleuronu.id=ur.user_id
groupbyu.id
orderbyu.iddesc
atcom.baomidou.mybatisplus.core.toolkit.ExceptionUtils.mpe(ExceptionUtils.java:39)
atcom.baomidou.mybatisplus.extension.parser.JsqlParserSupport.parserSingle(JsqlParserSupport.java:52)
atcom.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor.beforeQuery(TenantLineInnerInterceptor.java:65)
atcom.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:78)
atorg.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62)
atcom.sun.proxy.$Proxy178.query(UnknownSource)
atorg.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151)
...101commonframesomitted
Causedby:net.sf.jsqlparser.parser.ParseException:Encounteredunexpectedtoken:"ur"
atline2,column29.

我在mybatis-plus的官方提了一個issue:https://github.com/baomidou/mybatis-plus/issues/5086,也得到官方維護者的迅速回應說是JSqlParser解析的問題,不是mybatis-plus的問題~~~,給出的建議就是把別名ur改成別的,或者升級到JSqlParser的最新版本。

4.總結(jié)

至此,我們對多租戶系統(tǒng)數(shù)據(jù)隔離實現(xiàn)方案,架構設計,以及如何優(yōu)雅實現(xiàn)全局操作數(shù)據(jù)隔離都講完了,同時也對mybati-plus的多租戶插件實現(xiàn)原理和源碼流程套路進行了淺析,也對實際應用案例中進行了舉證并闡述了相關細節(jié)點。

當然數(shù)據(jù)權限不止停留在租戶(公司)層面上面,大多數(shù)系統(tǒng)的數(shù)據(jù)權限會按照業(yè)務組織架構角色來控制,數(shù)據(jù)權限其套路和根據(jù)角色判斷菜單權限一回事。

由于數(shù)據(jù)權限通常與公司業(yè)務相關,比較個性化,每家公司業(yè)務組織架構不盡相同,所以實際開發(fā)項目的數(shù)據(jù)權限隔離還需要大家按實際需求進行修改,但總的來說我們可以模仿多租戶隔離實現(xiàn)方式,比如說一個業(yè)務系統(tǒng)組織架構有公司(org_id),公司下有多個部門(dept_id),部門下有多個團隊分組(team_id),團隊下有多個人員(user_id)。

不同角色只能看到不同數(shù)據(jù),部門經(jīng)理只能看到自己部門的數(shù)據(jù),小組長只能看到自己小組的數(shù)據(jù),這些實現(xiàn)邏輯套路都可以模仿多租戶插件的方式進行優(yōu)雅實現(xiàn),這也是我后面有時間想研究的,后續(xù)會再出一篇數(shù)據(jù)權限的實現(xiàn)方案總結(jié)。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19400

    瀏覽量

    230742
  • SQL
    SQL
    +關注

    關注

    1

    文章

    773

    瀏覽量

    44211
  • SaaS
    +關注

    關注

    1

    文章

    363

    瀏覽量

    36992
  • MYSQL數(shù)據(jù)庫

    關注

    0

    文章

    96

    瀏覽量

    9421
收藏 人收藏

    評論

    相關推薦

    什么是SaaS?

    額外的成本,企業(yè)仍然需要購買、構建和維護自己獨立的IT基礎設備。SaaS為企業(yè)提供了另外一種選擇。如今,企業(yè)可以自行安裝注冊,并通過互聯(lián)網(wǎng)使用共享的基礎設施服務。 促使客戶采取SaaS解決方案
    發(fā)表于 07-13 09:23

    一種基于嵌入式系統(tǒng)隔離硬件設計

    本文在對已有的防火墻技術及物理隔離技術進行分析的基礎上,提出了帶緩沖區(qū)的雙通道實時開關技術,通過該技術所設計出的網(wǎng)絡隔離器能滿足實時數(shù)據(jù)的傳輸,同時本文提出了一種物理
    發(fā)表于 04-25 07:58

    一種通道同步數(shù)據(jù)采集及壓縮系統(tǒng)的設計方案  

    一種通道同步數(shù)據(jù)采集及壓縮系統(tǒng)的設計方案。  
    發(fā)表于 04-28 06:13

    大神分享一種高速突發(fā)模式誤碼測試儀的FPGA實現(xiàn)方案

    大神分享一種高速突發(fā)模式誤碼測試儀的FPGA實現(xiàn)方案
    發(fā)表于 04-29 06:58

    大佬分享一種光譜可見光遙感圖像壓縮系統(tǒng)的設計方案

    大佬分享一種光譜可見光遙感圖像壓縮系統(tǒng)的設計方案
    發(fā)表于 06-02 06:39

    一種基于Android和Zigbee技術實現(xiàn)的家庭環(huán)境監(jiān)控系統(tǒng)的設計方案

    齊全、運行穩(wěn)定的家庭監(jiān)控系統(tǒng)將具有非常大的市場競爭力。本文提出了一種基于Android和Zigbee技術實現(xiàn)的家庭環(huán)境監(jiān)控系統(tǒng)的設計方案,該
    發(fā)表于 07-26 08:08

    一種基于STM8系列單片機的無線通信系統(tǒng)的設計與實現(xiàn)方案

    一種基于STM8系列單片機的無線通信系統(tǒng)的設計與實現(xiàn)方案
    發(fā)表于 12-17 06:23

    一種基于單片機的拖尾式模式流水燈系統(tǒng)仿真設計

    一種基于單片機的拖尾式模式流水燈系統(tǒng)仿真設計
    發(fā)表于 02-17 06:59

    奧威軟件SaaS BI系統(tǒng)站式數(shù)據(jù)可視化解決方案

    SaaS BI 系統(tǒng)是 Software as a Service 商業(yè)智能的縮寫,是一種基于云計算的商業(yè)智能解決方案。它允許用戶通過互聯(lián)網(wǎng)訪問和分析
    發(fā)表于 08-01 10:21

    一種租戶場景基于SLO的調(diào)度機制

    針對租戶集群中無法保證作業(yè)服務水平目標( SLO)的問題,提出了一種租戶場景基于SLO的調(diào)
    發(fā)表于 01-12 15:37 ?0次下載

    可信云租戶隔離機制

    安全隔離機制的建設和管理過程,因此他們難以對云租戶隔離機制的安全有效性建立信心.將透明性要求視為可信云租戶隔離機制的
    發(fā)表于 01-13 10:21 ?0次下載

    Kubernetes租戶集群的概念和常見的應用模式

    KaaS 租戶方案通常與云服務提供商有關。在這種場景,業(yè)務平臺的服務通過 Kubernetes 控制平面直接暴露給不同租戶的用戶。最終用
    的頭像 發(fā)表于 05-15 16:13 ?1247次閱讀
    Kubernetes<b class='flag-5'>多</b><b class='flag-5'>租戶</b>集群的概念和常見的應用<b class='flag-5'>模式</b>

    基于SpringBoot實現(xiàn)租戶架構:支持應用租戶部署和管理

    租戶架構是指在個應用中支持多個租戶(Tenant)同時訪問,每個租戶擁有獨立的資源和數(shù)據(jù),并
    的頭像 發(fā)表于 06-05 10:20 ?1439次閱讀

    什么叫做saas,mybatis-plus優(yōu)雅實現(xiàn)租戶數(shù)據(jù)權限隔離方案

    租戶問題,其是一種架構設計方式,就是在臺或者組服務器上運行的SaaS
    發(fā)表于 07-27 10:34 ?4156次閱讀

    SaaS 租戶MES生產(chǎn)車間管理系統(tǒng)源碼,生產(chǎn)排程,工藝流程,工序采集

    MES系統(tǒng),即制造執(zhí)行系統(tǒng)(Manufacturing Execution System),是一種用于管理和監(jiān)控制造過程的軟件系統(tǒng)。 它位于企業(yè)資源計劃(ERP)
    的頭像 發(fā)表于 08-14 17:31 ?426次閱讀
    <b class='flag-5'>SaaS</b> <b class='flag-5'>多</b><b class='flag-5'>租戶</b>MES生產(chǎn)車間管理<b class='flag-5'>系統(tǒng)</b>源碼,生產(chǎn)排程,工藝流程,工序采集
    主站蜘蛛池模板: 亚洲无遮挡无码A片在线| 成人在线不卡视频| 久久久黄色片| 中文字幕在线观看网址| 蜜臀AV中文字幕熟女人妻| 办公室里做好紧好爽H| 午夜影院一区二区三区| 九九在线免费视频| xxx性欧美在线观看| 亚州三级久久电影| 伦理片飘花手机在线| 沟沟人体一区二区| 亚洲黄色录像片| 男人插曲女人的视频| 国产黄大片在线视频| 在线日本高清日本免费| 色内射无码AV| 久久黄色录像| 国产超嫩一线天在线播放 | 日本wwwxx| 国精产品一区二区三区| 99久久久无码国产精品免费人妻 | 国产欧美第一页| 91麻豆久久| 亚洲成人免费| 青青草原免费在线| 久99久热只有精品国产99| 高清无码中文字幕影片| 最新无码专区在线视频| 午夜一级视频| 日本工口生肉全彩大全| 久久亚洲一级α片| 国产小视频免费在线观看| 爱很烂qvod| 中文字幕在线播放| 亚洲AV天堂无码麻豆电影| 全黄h全肉细节文在线观看| 久久亚洲欧美国产综合| 国产永不无码精品AV永久| 超级最爽的乱淫片免费| 1234成人网|