精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用JBoss jBPM實現(xiàn)流程訪問和執(zhí)行的授權(quán)

開發(fā) 后端
JBPM是一個覆蓋了業(yè)務(wù)流程管理、工作流、服務(wù)協(xié)作等領(lǐng)域的一個開源的、靈活的、易擴展的可執(zhí)行流程語言框架。最大的特色就是它的商務(wù)邏輯定義沒有采用目前的一些規(guī)范,而是采用了它自己定義的JBoss jBPM Process definition language (jPdl)。

當(dāng)今常見的BPM趨勢是集中化整個公司或公司內(nèi)大部門的BPM執(zhí)行。這意味著,單個BPM服務(wù)器(集群)運行著整個公司的許多流程定義。這種方式的挑戰(zhàn)在 于,雖然BPM引擎(包括jBPM)提供了對于任務(wù)訪問的授權(quán),但它們一般都不支持這些功能的授權(quán):流程定義的查看和刪除,流程實例的啟動、結(jié)束、查看和刪除等。在這篇文章中,我們將描述如何對jBPM引擎進行擴展 (基于jBPM 4.3)來實現(xiàn)這一功能。

整體實現(xiàn)方法

整個實現(xiàn)方式相當(dāng)直接了當(dāng)——對于每個流程定義引入一組可以授權(quán)的用戶/用戶組(類似任務(wù)定義),作用于定義、實例和給定流程的歷史。此外,我們還想對給 定的用戶/用戶組支持多重授權(quán)級別——目前我們打算引入2個角色:“starter”和“user”。這里的“starter”是允許對流程定義/實例 /歷史進行任何操作的角色,而“user”角色的權(quán)限僅限于查詢流程/歷史。

這種方式的實現(xiàn)需要對jBPM進行以下改造:

◆流程定義:

給流程定義增加流程訪問權(quán)限

◆流程部署:

擴展當(dāng)前的流程部署器,增加流程授權(quán)定義的解析和流程訪問列表的生成

引入額外的類/數(shù)據(jù)庫表,存放每個流程定義的訪問權(quán)限

◆流程執(zhí)行(Execution)

引入已授權(quán)命令(authorized command)——要求用戶經(jīng)過授權(quán)才能執(zhí)行的命令

修改現(xiàn)有的jBPM中我們期望基于當(dāng)前用戶證書進行授權(quán)的部分。這包括啟動、結(jié)束和刪除流程實例,以及刪除部署定義。

修改現(xiàn)有的jBPM查詢,考慮現(xiàn)有用戶的證書。這包括部署和流程定義查詢、流程實例查詢,以及歷史流程實例、活動和細(xì)節(jié)的查詢。

除了以上更改,我們還想擴展流程實例查詢,好讓用戶可以通過指定某些流程變量的值來縮小查詢結(jié)果。這種搜索的一個常見情況就是查詢“由我啟動的”流程。為 了確保這種查詢總是可用,我們更改了啟動流程實例命令的實現(xiàn),顯式地把當(dāng)前用戶ID加到了流程變量值的集合中。

最后,為了支持多種用戶認(rèn)證方法,我們實現(xiàn)了一個自定義的身份會話,它支持用程序來設(shè)置和訪問當(dāng)前用戶的證書。其目的在于,把用戶證書(ID和參與的組) 的獲得和jBPM運行時對這種信息的使用分離開來。

我們的實現(xiàn)利用了非常強大和靈活的jBPM 4的配置機制,它讓我們可以:

通過擴展現(xiàn)有jBPM類,最小化了自定義代碼的數(shù)量,只實現(xiàn)我們擴展所需的額外功能

將我們的擴展實現(xiàn)成可以與jBPM 4類庫一起使用的單獨jar包,無需對現(xiàn)有庫進行任何改變。

在深入我們的實現(xiàn)細(xì)節(jié)之前,我們首先要討論一下我們大量使用的jBPM 4的配置。

#p#

jBPM 4的配置機制

jBPM的基礎(chǔ)是流程虛擬機(PVM)[2],它建立在自定義的依賴注入實現(xiàn)之上。依賴注入由非常強大的、基于XML的配置機制控制,這種機制用于創(chuàng)建標(biāo)簽和預(yù)定義接口相關(guān)的特定實現(xiàn)之間的綁定 (binding)。

這種機制的核心是jbpm.wire.bindings.xml文件,它描述了[3] jBPM PVM的主要組件,包括:

◆基本類型

◆對象及引用

◆環(huán)境引用

◆Hibernate綁定

◆會話

◆服務(wù)

◆部署器

◆攔截器

◆等

該文件是jBPM分發(fā)包的一部分。如果用戶想增加自己的綁定(binding),他可以創(chuàng)建jbpm.user.wire.bindings.xml描述 它們,而不用修改jbpm.wire.bindings.xml文件。

這兩個文件會被jBPM PVM在啟動時讀入并解析,為定義在jbpm.cfg.xml中的基礎(chǔ)PVM執(zhí)行(execution)配置而服務(wù)。jbpm.cfg.xml一般會包含 多個部分,描述了PVM執(zhí)行的特定組件的配置。

jBPM PVM由一組提供PVM功能的服務(wù)組成[4]。主要的PVM服務(wù)包括:

◆倉儲服務(wù),提供一組查看和管理部署倉儲的方法

◆執(zhí)行服務(wù),提供一組查看和管理運行中流程執(zhí)行(execution)的方 法。

◆管理服務(wù),提供一組查看和管理工作(job)的方法

◆任務(wù)服務(wù),提供一組查看和管理用戶任務(wù)(task)的方法。

◆歷史服務(wù),提供一組訪問運行中和已完成流程執(zhí)行的歷史信息的方法。

這組可用服務(wù)和實現(xiàn)這些服務(wù)的類(使用前面說的綁定)被配置成流程引擎的上下文。

服務(wù)執(zhí)行被實現(xiàn)成一組命令(command),它們作為服務(wù)方法執(zhí)行的一部分被調(diào)用。命令的實際執(zhí)行由命令服務(wù)控制。

命令服務(wù)在命令服務(wù)上下文中被配置成一組攔截器,實現(xiàn)橫切關(guān)注點,環(huán)繞(around)命令調(diào)用(命令執(zhí)行管線)。缺省的jBPM分發(fā)包在命令執(zhí)行管線中 攜帶了以下攔截器:

◆重試(Retry)攔截器負(fù)責(zé)重試命令執(zhí)行

◆環(huán)境(Environment)攔截器負(fù)責(zé)在必要時把jBPM上下文注入命 令執(zhí)行中

◆事務(wù)(Transaction)攔截器負(fù)責(zé)介入命令調(diào)用的事務(wù)邊界劃分。

攔截器是將jBPM移植到不同環(huán)境以及引入其他橫切關(guān)注點的核心機制。

命令執(zhí)行一般會利用環(huán)境,它也是可配置的。典型的環(huán)境組件有:

◆倉儲會話

◆DB會話

◆消息會話

◆定時器會話

◆歷史會話

◆郵件會話

可以添加其他會話來擴展PVM的功能。

最后,部署管理器配置允許指定一組部署器,它們依次執(zhí)行,把業(yè)務(wù)流程部署到PVM。這種方法使得擴展流程定義可以通過實現(xiàn)額外的部署步驟完成,無需覆蓋 jBPM分發(fā)包自帶的部署器。

整個PVM的架構(gòu)如圖1示:

 

圖 1 PVM架構(gòu)

#p#

在流程定義中引入授權(quán)

我們在圖2中看到,可以給流程定義添加任意屬性。利用這種擴展選項,我們現(xiàn)在定義以下流程屬性,描述授權(quán)策略:

◆starter-users,具有“starter”角色的用戶列表

◆starter-groups,具有 “starter”角色的組列表

◆user-users,具有“user”角色的用戶列表

◆user-groups,具 有“user”角色的組列表

每個屬性的值是逗號分隔的組/用戶id列表。

 

 

圖 2 流程定義模式

此外,我們還定義了一個特殊的用戶類型——“any”和兩個用戶組——“all”和“admin”。任何用戶,不論其真實ID是什么,都是“any”用 戶。任何組,不論其ID是什么,也都是“all”。最后,“admin”組的成員被認(rèn)為是任意組的成員。

流程授權(quán)定義由以下規(guī)則驅(qū)動:

◆如果user-users和user-groups都未被指定,則user-users=”all”

◆如果 starter-users和starte-groups都未被指定,則流程用戶被額外地分配“starter”角色。

按照這個規(guī)則,清單1中的流程可以被任何人啟動和使用。

  1. <process package="com.navteq.jbpm" 
  2.          key="NO_AUTHORIZATION" 
  3.          name="Test Authorization not required" 
  4.          version="1" 
  5.          xmlns="http://jbpm.org/4.0/jpdl"> 
  6.     <start g="68,14,48,48" name="start"> 
  7.         <transition to="end"/> 
  8.     </start> 
  9.     <end g="78,383,48,48" name="end"/> 
  10. </process> 
  11.  

清單 1 沒有授權(quán)信息的流程定義

清單2的流程可以被mark或tomcat組中的任何人使用和啟動。

  1. <process package="com.navteq.jbpm" 
  2.          key="AUTHORIZATION" 
  3.          name="Test Authorization Required" 
  4.          version="1" 
  5.          xmlns="http://jbpm.org/4.0/jpdl" 
  6.          user-users="mark" 
  7.          user-groups="tomcat"> 
  8.     <start g="68,14,48,48" name="start" > 
  9.         <transition to="end"/> 
  10.     </start> 
  11.     <end g="78,383,48,48" name="end"/> 
  12. </process> 

清單 2 具有用戶授權(quán)信息的流程定義

我們引入了一個新類——ACL,針對給定流程 (processDefinitionID,processDefinitionKey,DeploymentID),它包含一個單獨的訪問列表(用戶或 組,以及類型);同時還引入了相應(yīng)的Hibernate定義。

圖3中,清單1的流程部署為具有兩個角色(“user”和“starter”)的用戶“any”創(chuàng)建了2個ACL;而在圖4中,清單2的流程部署將創(chuàng)建4 個——用戶“mark”和組“tomcat”,每個都具有2個角色:“user”和“starter”。

 

圖 3 無授權(quán)信息的流程的ACL

 

圖 4 有用戶授權(quán)信息的流程的ACL

這些ACL的生成是通過引入額外的部署器完成的,它將在“標(biāo)準(zhǔn)”jBPM部署器之后運行,抽取上面描述的授權(quán)屬性,為給定流程構(gòu)建ACL。

#p#

保護jBPM命令

我們采用了一種通用的方法來保護jBPM命令,包括實現(xiàn)用于定義命令所需授權(quán)信息的自定義的注解,以及處理這個注解的自定義的授權(quán)會話(命令攔截器)實現(xiàn)。

授權(quán)注解(清單3)可以指定所需的用戶角色和表示某個流程的方法。

  1. @Retention(value=RetentionPolicy.RUNTIME)  
  2. @Target(value=ElementType.METHOD)  
  3. public @interface AuthorizedCommand {  
  4.     /** Access type */ 
  5.     public String role();  
  6.     String key();  
  7. }  
  8.  

清單 3 授權(quán)注解

對于某個流程,用戶角色——“starter”或“user”——指向某個用戶應(yīng)該擁有的角色[6]。由于不同命令既可以引用部署ID,也可以引用流程ID或者流程鍵值,因此注解支持多種指定鍵值的方式,允許將合適的引用指定為鍵值。

清單4的授權(quán)攔截器檢查是否有命令的方法被授權(quán)注解修飾。如果有,則執(zhí)行適當(dāng)?shù)牟樵儯_定出哪些用戶和用戶組集合被授權(quán)給了這個命令,然后檢查當(dāng)前用戶是 否屬于他們。

  1. …………  
  2.  
  3. @SuppressWarnings("unchecked")  
  4. public void checkPermission(Command<?> command, EnvironmentImpl environment) {  
  5.     environment.setAuthenticatedUserId(environment.get(AuthorizationIdentitySession.class).getAuthenticatedUserId());  
  6.     for( Method method : command.getClass().getMethods()) {  
  7.         AuthorizedCommand sc = method.getAnnotation(AuthorizedCommand.class);  
  8.         if(sc != null){  
  9.             log.debug("Checking Class based Secured Function");  
  10.             String ID = environment.get(AuthorizationIdentitySession.class).getAuthenticatedUserId();  
  11.             Object value = null;  
  12.             try {  
  13.                 log.debug("Checking authorization: " + command.getClass().getName());  
  14.                 Session session = environment.get(SessionImpl.class);  
  15.                 value = method.invoke(command, (Object[])null);  
  16.                 Query uQ = session.createQuery(userQuery.get(sc.key())).  
  17.                 setString("role", sc.role()).setString("value",(String) value);  
  18.                 Query gQ = session.createQuery(groupQuery.get(sc.key())).  
  19.                 setString("role", sc.role()).setString("value", (String) value);  
  20.                 List<String> userIds = (List<String>)uQ.list();  
  21.                 List<String> groups = (List<String>)gQ.list();  
  22.                 if(!isAuthorized(environment, userIds, groups))   
  23.                     throw new AccessControlException(ID+" attempted access to ProcessDefinition #"+value);  
  24.             } catch (IllegalArgumentException e) {  
  25.                 log.error("Caught " + IllegalArgumentException.class, e);  
  26.                 throw new AccessControlException(ID+" attempted access to ProcessDefinition #"+value);  
  27.             } catch (IllegalAccessException e) {  
  28.                 log.error("Caught " + IllegalAccessException.class, e);  
  29.                 throw new AccessControlException(ID+" attempted access to ProcessDefinition #"+value);  
  30.             } catch (InvocationTargetException e) {  
  31.                 log.error("Caught " + InvocationTargetException.class, e);  
  32.                 throw new AccessControlException(ID+" attempted access to ProcessDefinition #"+value);  
  33.             }  
  34.         }    
  35.     }  
  36.     return;  
  37. }  
  38.  
  39. ……………………  
  40.  
  41. public boolean isAuthorized(EnvironmentImpl env, List<String> authorizedUserIds, List<String> authorizedGroupIds) {  
  42.     AuthorizationIdentitySession identitySession = env.get(AuthorizationIdentitySession.class);  
  43.     if (authorizedUserIds.contains(AuthorizationIdentitySession.ANONYMOUS_USER_ID))   
  44.         return true;  
  45.     if (authorizedUserIds.contains(identitySession.getAuthenticatedUserId()) )   
  46.         return true;  
  47.     //check if any of userGroups is an authorized group.  if so then return true  
  48.     List<Group> groups = identitySession.findGroupsByUser(identitySession.getAuthenticatedUserId());  
  49.     for(Group group : groups){  
  50.         String g = group.getId();  
  51.         //admin is allowed to execute any command  
  52.         if(g.equals(AuthorizationIdentitySession.ADMINISTRATORS_GROUP))  
  53.             return true;  
  54.         if(authorizedGroupIds.contains(g))  
  55.             return true;  
  56.     }  
  57.     return false;  
  58. }  
  59.  

清單 4 授權(quán)攔截器

為了保護命令實現(xiàn),我們創(chuàng)建了一個新類,它擴展了現(xiàn)有的命令,增加了一個帶注解的方法(清單5),返回給定命令可用的鍵值。

  1. @AuthorizedCommand(role = ACL.STARTER, key = NavteqAuthorizationSession.PROCESSID)  
  2. public String getProcessDefinitionKey() {  
  3.    return processDefinitionId;  

清單 5 給啟動流程實例命令引入授權(quán)信息

根據(jù)所提議的方法,我們對下列命令進行了注解:

◆刪除部署

◆啟動流程實例

◆啟動最近的流程實例

◆結(jié)束流程實例

◆刪除流程實例

#p#

擴展查詢

引入授權(quán)意味著查詢結(jié)果應(yīng)該只返回用戶被授權(quán)查看的信息[7]。這可以通過擴展現(xiàn)有查詢的where語句實現(xiàn)(清單6)。

  1. //check authorization  
  2. String userId = EnvironmentImpl.getCurrent().getAuthenticatedUserId();  
  3. List<Group> userGroups = EnvironmentImpl.getCurrent().get(IdentitySession.class).findGroupsByUser(userId);  
  4.  
  5. hql.append(", " + ACL.class.getName() + " as acl ");  
  6. appendWhereClause("acl.deployment=deployment and acl.type='" +   
  7.                   ACL.STARTER +   
  8.                   "' ", hql);  
  9. appendWhereClause("((acl.userId in " +   
  10.                   Utils.createHqlUserString(userId) +   
  11.                   ") or " +   
  12.                   "(acl.groupId in " +   
  13.                   Utils.createHqlGroupString(userGroups) + "))   
  14.                   ", hql);  

清單 6 為流程定義查詢提供授權(quán)支持的額外where語句

額外的where語句是通過擴展現(xiàn)有查詢實現(xiàn)和覆蓋hlq方法實現(xiàn)的。

按照這種方法,擴展了以下查詢:

◆部署查詢

◆流程定義查詢

◆流程實例查詢

◆歷史流程實例查詢

◆歷史活動 查詢

◆歷史細(xì)節(jié)查詢

為了能夠增加字符串實例變量,以縮小查詢結(jié)果,我們還額外擴展了一個流程實例查詢。

#p#

支持多種用戶管理方式

以上給出的實現(xiàn)依賴使用執(zhí)行環(huán)境來獲得當(dāng)前用戶ID和使用IdentitySession來獲得用戶組成員關(guān)系。jBPM分發(fā)包提供了這個接口的2個實現(xiàn):

◆IdentitySessionImpl,基于jBPM的用戶/組數(shù)據(jù)庫

◆JBossIdmIdentitySessionImpl, 基于JBoss Identity IDM組件

不同于大量依賴其他技術(shù)的實現(xiàn),對于我們的實現(xiàn),我們決定把用戶ID/組的獲取同這些信息的保存分離開來,使之可以被其他的jBPM實現(xiàn)利用(圖5)。

 

 

圖 5 用戶管理實現(xiàn)

為了確保在設(shè)定和重新設(shè)定用戶證書的時候環(huán)境是可用的,我們把這兩個操作實現(xiàn)成了命令(清單7),這樣,借助jBPM命令執(zhí)行服務(wù)就可以正確設(shè)置執(zhí)行環(huán)境。

  1. public static class SetPrincipalCommand extends AbstractCommand<Void> {  
  2.     private static final long serialVersionUID = 1L;  
  3.     private String userId;  
  4.     private String[] groups;  
  5.     public SetPrincipalCommand(String u, String...groups) {  
  6.         this.userId=u; this.groups=groups;  
  7.     }  
  8.     public Void execute(Environment environment) throws Exception {  
  9.         environment.get(AuthorizationIdentitySession.class).setPrincipal(userId,groups);  
  10.         return null;  
  11.     }  
  12. }  
  13.  
  14. public static class ResetPrincipalCommand extends AbstractCommand<Void> {  
  15.     private static final long serialVersionUID = 1L;  
  16.     public Void execute(Environment environment) throws Exception {  
  17.         environment.get(AuthorizationIdentitySession.class).reset();  
  18.         return null;  
  19.     }  
  20. }  
  21.  

清單 7 設(shè)置用戶證書命令

#p#

把新命令和查詢引入到j(luò)BPM執(zhí)行中

由于jBPM并沒有提供任何配置“命令——服務(wù)”關(guān)系的支持,為了能改變給定服務(wù)中的命令,就必須使用調(diào)用新命令的新服務(wù)實現(xiàn)覆蓋舊實現(xiàn)。清單8給出了一個使用新命令服務(wù)覆蓋歷史服務(wù)的例子。

  1. public class NavteqHistoryServiceImpl extends HistoryServiceImpl {  
  2.     @Override 
  3.     public HistoryActivityInstanceQuery createHistoryActivityInstanceQuery() {  
  4.       return new AuthorizedHistoryActivityInstanceQueryImpl(commandService);  
  5.     }  
  6.  
  7.     @Override 
  8.     public HistoryDetailQuery createHistoryDetailQuery() {  
  9.         return new AuthorizedHistoryDetailQueryImpl(commandService);  
  10.     }  
  11.  
  12.     @Override 
  13.     public HistoryProcessInstanceQuery createHistoryProcessInstanceQuery() {  
  14.         return newAuthorizedHistoryProcessInstanceQuery(commandService);  
  15.     }  
  16. }  
  17.  

清單 8 在歷史服務(wù)中引入授權(quán)命令

總結(jié)

本文給出的這部分實現(xiàn)[8]并沒有擴展JPDL,而是擴展了被jBPM支持的所有語言都使用的JBoss PVM[9]。結(jié)果是,這些語言都能夠使用這個實現(xiàn)。

致謝

我要感謝NAVTEQ的同事,尤其是Mark Kedzierski和我一起討論了整個設(shè)計和大部分代碼的實現(xiàn),以及Stefan Balkowec、Vlad Zhukov、Eugine Felds和Catalin Capota在定義整個解決方案中的幫助。 

【編輯推薦】

  1. jBPM應(yīng)用開發(fā)指南
  2. jBPM實現(xiàn)高級交互模式詳解
  3. Java工作流管理系統(tǒng)jBPM 4.3發(fā)布 支持BPMN 2.0
  4. jBPM4.1發(fā)布 改進多項Tomcat支持
  5. 淺談jBPM4與Spring整合的2種方式

 

責(zé)任編輯:佚名 來源: infoq
相關(guān)推薦

2024-11-06 13:03:06

2009-06-26 13:51:49

jBPM4高級圖形執(zhí)行

2009-06-11 13:28:09

JBossjBPM安裝配置jBPM tomcat

2023-03-26 00:00:00

2010-05-25 18:29:30

MySQL遠(yuǎn)程訪問

2016-11-08 19:56:09

GitLab漏洞遠(yuǎn)程命令

2009-06-11 13:43:21

jBPM用戶指南jBPM 4.0

2009-06-17 16:56:45

JBoss服務(wù)器JSF實現(xiàn)

2014-07-30 14:35:33

LinuxApache

2009-06-24 15:57:44

JPQL命名查詢

2010-01-20 09:23:38

jBPM高級交互模式jBPM四眼原則

2009-06-17 09:01:20

JBoss訪問EJB

2009-06-15 10:40:14

2009-06-11 13:22:18

JBPM數(shù)據(jù)庫

2011-03-15 16:03:32

MySQL授權(quán)表服務(wù)器

2009-06-25 16:36:31

JBPM流程圖

2009-06-11 13:39:32

jBPM數(shù)據(jù)庫

2009-07-08 10:30:57

WebWork

2010-09-01 16:43:26

Squid ACLSquid訪問列表Squid

2009-06-26 17:37:37

JBOSS配置
點贊
收藏

51CTO技術(shù)棧公眾號

99国产精品免费| 亚洲精品第一区二区三区| 劲爆欧美第一页| 伊人久久影院| 午夜不卡av在线| 国产在线一区二区三区播放| 波多野结衣国产| 国产区精品区| 欧美日韩国产高清一区二区三区| 中国女人做爰视频| 99久久精品免费看国产交换| 99精品视频免费观看| 中文字幕av一区中文字幕天堂| 三级性生活视频| 爱情岛亚洲播放路线| 久久蜜桃一区二区| 成人性生交大片免费看视频直播| 久久久久久欧美精品se一二三四| 日韩高清成人在线| 欧美日韩亚洲综合| 国产美女主播在线| 成人在线免费电影| 成人91在线观看| 国产精品黄色影片导航在线观看| 亚洲国产成人精品综合99| 欧美aaaaa级| 欧美亚洲国产一区在线观看网站| 日本福利视频在线观看| 黄色av免费在线观看| 国产成人免费高清| 成人福利免费观看| 精品欧美一区二区三区免费观看| 日韩欧美伦理| 日韩精品久久久久久福利| 日本高清一区二区视频| 麻豆理论在线观看| 亚洲精品中文在线| 亚洲图色在线| 你懂的在线网址| 成人中文字幕电影| 91精品视频免费观看| 少妇太紧太爽又黄又硬又爽 | 国产亚洲一区二区三区在线播放| 国产精品传媒在线观看| 日韩视频精品在线观看| 久久亚洲欧美日韩精品专区| 中文字幕网站在线观看| 精品精品精品| 精品国产乱码久久久久久影片| 小泽玛利亚视频在线观看| 国产在线精彩视频| 国产精品麻豆99久久久久久| 欧美二区在线| 黄色av一区二区三区| 精品在线免费视频| 国产精品热视频| 国产污片在线观看| 亚洲精品一级| 久久人人爽人人爽人人片av高请 | 91精品国产高清自在线 | 少妇人妻精品一区二区三区| 韩国成人在线视频| 国产精品视频导航| 午夜一级黄色片| 日韩中文字幕区一区有砖一区| 91禁外国网站| 日本少妇久久久| 亚洲三级视频| 91国内在线视频| 视频一区二区三区四区五区| 夜夜嗨av一区二区三区网站四季av| 欧美高清视频一区二区| 成年人网站国产| 亚洲女人久久久| 日韩精品丝袜美腿| 日韩av在线一区二区| 第一页在线视频| 亚洲图色一区二区三区| 精品国产91久久久久久久妲己| 久久久福利影院| 欧洲精品99毛片免费高清观看 | 欧美电影免费网站| 亚洲电影天堂av| 视频免费在线观看| 美女网站一区| 亚洲午夜精品久久久久久久久久久久| 亚洲第一香蕉网| 精品高清久久| 久久精彩免费视频| www.99re6| 91综合在线| 欧美成人亚洲成人| 日本三级免费看| 久久狠狠婷婷| 91精品久久久久久久久久久久久| 国产精品一区二区黑人巨大 | 欧美~级网站不卡| 欧美激情图片区| 亚洲男人的天堂在线视频| 日本亚洲视频在线| 成人a在线观看| 少妇精品视频一区二区 | 欧美大肚乱孕交hd孕妇| 日本黄色动态图| 成人精品视频| 久久香蕉国产线看观看av| 久久视频免费在线观看| 肉色丝袜一区二区| 91在线免费看片| 男人av在线| 亚洲素人一区二区| 无码专区aaaaaa免费视频| 日韩成人亚洲| 日韩欧美一级二级三级久久久| 人妻少妇精品视频一区二区三区| 成人在线免费观看网站| 欧美激情乱人伦| 日韩精选在线观看| 懂色av一区二区在线播放| 欧美日韩天天操| 麻豆影院在线| 一区二区高清视频在线观看| 男女日批视频在线观看| 伦一区二区三区中文字幕v亚洲| 日韩视频一区二区| 亚洲v国产v欧美v久久久久久| 综合久久99| 国产精品视频一区二区三区四| 超碰在线播放97| 国产欧美日本一区视频| 97视频久久久| 看片一区二区| 亚洲欧洲一区二区三区在线观看 | 精品少妇一区| 精品国偷自产在线| 波多野结衣在线电影| 成人av网站大全| 男人天堂成人网| 国产成人精品一区二区三区视频| 亚洲激情电影中文字幕| 日本在线一级片| 奇米影视7777精品一区二区| 久久久国产精品一区二区三区| 欧美成人性生活视频| 亚洲国产日日夜夜| 在线成人精品视频| 久久亚洲影视| 国产男人精品视频| 韩日视频在线| 91高清视频在线| 性欧美丰满熟妇xxxx性仙踪林| 伊人久久成人| 亚洲一区二区四区蜜桃| 久久免费一级片| 日韩av黄色| 色偷偷亚洲男人天堂| 福利网址在线观看| 大白屁股一区二区视频| a级黄色片免费| 久久久久久爱| 欧美精品少妇videofree| 在线观看国产黄| 中国av一区二区三区| av视屏在线播放| 欧美日韩激情| 国产精品第一页在线| 国产在线日本| 日本韩国欧美一区| 三区四区在线观看| 美美哒免费高清在线观看视频一区二区 | 毛片av在线| 一本大道av一区二区在线播放| 国产一线在线观看| 亚洲激情一区| 狠狠色综合色区| av电影一区| 亚洲性av在线| 91黄色在线视频| 日韩毛片精品高清免费| 黑人无套内谢中国美女| 欧美三级不卡| 国内精品国语自产拍在线观看| 欧美男男video| 亚洲激情视频网| 国产免费一级视频| 国产精品久久久久久福利一牛影视 | 久久成人激情视频| 免费成人在线网站| 第九区2中文字幕| 久久狠狠久久| 国产精品高潮呻吟久久av黑人| 成人亚洲综合天堂| 日韩一级黄色大片| 自拍偷拍欧美亚洲| 国产欧美一区二区三区沐欲| 无码少妇一区二区三区芒果| 99久久亚洲精品蜜臀| 国产精品二区在线观看| 日本午夜大片a在线观看| 亚洲欧美一区二区激情| 夜夜爽8888| 亚洲午夜三级在线| 国产综合精品在线| 老色鬼精品视频在线观看播放| 97热精品视频官网| 国产99久久精品一区二区永久免费 | 青青草久久网络| 妖精视频在线观看免费| 日韩精品亚洲一区| 免费成人进口网站| 视频在线一区| 欧洲精品在线视频| 成人在线观看亚洲| 精品一区二区三区电影| 一级特黄aaa大片| 第一福利永久视频精品| 日本一二三不卡视频| 成人毛片视频在线观看| 手机在线免费观看毛片| 影音先锋中文字幕一区| 亚洲精品第一区二区三区| 国产福利资源一区| 91精品国产综合久久久久久久久| 色黄视频在线观看| 美女扒开尿口让男人操亚洲视频网站| 天天色天天操天天射| 欧美精品 国产精品| 欧美a视频在线观看| 一区二区不卡在线播放| 99国产精品免费| 久久亚洲私人国产精品va媚药| 久久精品无码一区二区三区毛片| 香蕉久久国产| 日韩欧美猛交xxxxx无码| 日韩成人综合| 欧美激情导航| 福利片一区二区| 亚洲一区二区三区视频| 国精产品一区一区三区四川| 欧美猛交ⅹxxx乱大交视频| av基地在线| 亚洲欧美一区二区激情| 四虎精品一区二区三区| 日韩欧美国产一区在线观看| 91国内精品久久久| 欧美日韩视频专区在线播放| 国产污视频网站| 欧美日韩午夜剧场| 日韩精品手机在线| 亚洲va欧美va人人爽午夜 | 国产伦精品一区二区三区免费优势 | 国产精品丝袜高跟| 亚洲va中文在线播放免费| 91精品国产91久久| 2020国产在线| 欧美精品videossex性护士| 哥也色在线视频| 久久精品国产亚洲精品2020| 国产98在线| 在线电影av不卡网址| 99re在线视频| 中文字幕在线亚洲| 无遮挡动作视频在线观看免费入口| 亚洲精品wwww| 神马亚洲视频| 亚洲欧美日韩成人| 黄上黄在线观看| 在线观看国产精品91| 求av网址在线观看| 欧美成人中文字幕在线| a视频在线观看免费| 久久久久久久久久国产精品| 538在线观看| 欧美一二三视频| 日韩欧美少妇| 国产成人福利视频| 亚洲最大网站| 国产精品高潮呻吟久久av野狼| 亚洲综合av一区二区三区| 国产精品视频播放| 日韩精品视频中文字幕| 91网站在线看| 国内精品麻豆美女在线播放视频 | 国产日韩久久久| 欧美日韩aaaaaa| 国产福利视频导航| 日韩av网站导航| 成人影院免费观看| 欧美超级乱淫片喷水| 变态调教一区二区三区| 国产精品成人久久久久| 成人短视频软件网站大全app| 91美女福利视频高清| 卡通动漫国产精品| 日本一区二区三区四区在线观看| 伊人久久大香线蕉综合网蜜芽 | 综合视频在线| av之家在线观看| 在线亚洲伦理| 午夜剧场高清版免费观看 | 亚洲国产aⅴ天堂久久| 麻豆精品久久久久久久99蜜桃| 精品久久久香蕉免费精品视频| 国产精品国产精品国产| 欧美成人女星排名| 日本免费不卡| 视频在线观看99| wwwww亚洲| 国产精品视频资源| 国产人妖ts一区二区| 欧美精品粉嫩高潮一区二区| 欧美成人第一区| 亚洲人成网77777色在线播放| 手机在线观看国产精品| 亚洲无吗在线| 手机看片一级片| 不卡电影一区二区三区| 国产精品白丝喷水在线观看| 色偷偷成人一区二区三区91| 成人毛片在线精品国产| xxxx性欧美| 成人黄色免费短视频| 国产麻豆日韩| 91精品福利| 亚州精品一二三区| 久久九九国产精品| 色婷婷av国产精品| 精品毛片乱码1区2区3区| 免费黄色在线| 国产精品久久久久秋霞鲁丝 | 6080亚洲理论片在线观看| 亚洲视频精品一区| 青青青爽久久午夜综合久久午夜| aaaaa一级片| 婷婷六月综合亚洲| 欧美视频一二区| 欧美极品第一页| 爱爱精品视频| 国产青草视频在线观看| 国产福利视频一区二区三区| 人人澡人人澡人人看| 69堂成人精品免费视频| 久久日韩视频| 91pron在线| 亚洲视频碰碰| 看全色黄大色黄女片18| 一区二区三区**美女毛片| 成 人 免费 黄 色| 久久99精品视频一区97| gogo久久日韩裸体艺术| 青青青在线视频播放| 99视频超级精品| 久久人妻免费视频| 亚洲色在线视频| 日韩福利影视| 日本a级片在线观看| 岛国一区二区三区| 丰满少妇乱子伦精品看片| 日韩成人在线播放| 欧美自拍电影| 伊人久久99| 国产91对白在线观看九色| 日韩三级小视频| 精品爽片免费看久久| 成人精品三级| 久久福利一区二区| 91年精品国产| 中文字幕观看视频| 欧美精品免费在线观看| 成人知道污网站| 18岁视频在线观看| 最新成人av在线| 欧美视频在线观看一区二区三区| 日本精品性网站在线观看| 日韩综合网站| 日本性生活一级片| 日本精品视频一区二区| www.久久久久.com| 精品毛片久久久久久| 男人操女人的视频在线观看欧美| 色在线观看视频| 亚洲精品在线不卡| 99tv成人影院| 欧洲av无码放荡人妇网站| 综合色天天鬼久久鬼色| 色视频在线观看福利| 91精品久久久久久久久| 制服诱惑一区二区| 久久爱一区二区| 日韩精品极品在线观看| 91国产一区| 成人一级片网站| 亚洲免费伊人电影| 大乳在线免费观看| 俄罗斯精品一区二区| 爽好久久久欧美精品| 久久网免费视频| 搡老女人一区二区三区视频tv| 国产色噜噜噜91在线精品 | 亚洲欧美在线网|