久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

使用 Acegi 保护 Java 应用程序

發布時間:2025/4/5 java 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 Acegi 保护 Java 应用程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第 1 部分: 架構概覽和安全過濾器

Acegi Security System 是一種功能強大并易于使用的替代性方案,使您不必再為 Java 企業應用程序編寫大量的安全代碼。雖然它專門針對使用 Spring 框架編寫的應用程序,但是任何類型的 Java 應用程序都沒有理由不去使用 Acegi。這份共分三部分的系列文章詳細介紹了 Acegi,并展示了如何使用它保護簡單的企業應用程序以及更復雜的應用程序。

本系列首先介紹企業應用程序中常見的安全問題,并說明 Acegi 如何解決這些問題。您將了解 Acegi 的架構模型及其安全過濾器,后者包含了在保護應用程序中將用到的大多數功能。您還將了解到各個過濾器如何單獨進行工作,如何將它們組合起來,以及過濾器如何在一個企業安全實現中將各種功能從頭到尾地鏈接起來。本文最后通過一個樣例應用程序演示了基于 URL 安全系統的 Acegi 實現。本系列后續兩篇文章將探究 Acegi 的一些更高級的應用,包括如何設計和托管訪問控制策略,然后如何去配置 Acegi 以使用這些策略。

您必須?下載 Acegi,這樣才能編譯本文的示例代碼并運行本文的樣例應用程序。還必須有作為工作站的一部分運行的 Tomcat 服務器。

企業應用程序安全性

由于企業內容管理(ECM)應用程序管理存儲在不同類型數據源(如文件系統、關系數據庫和目錄服務)中的企業內容的編寫和處理,ECM 安全性要求對這些數據源的訪問進行控制。比如,一個 ECM 應用程序可能會控制被授權讀取、編輯或刪除數據的對象,而這些數據和制造業企業的設計、市場營銷、生產以及質量控制有關。

在一個 ECM 安全場景中,比較常見的就是通過對企業資源定位符(或網絡地址)應用安全性,從而實現訪問控制。這種簡單的安全模型被稱為統一資源定位符?或 URL 安全性。正如我在本文后面(以及本系列后續文章)所演示的一樣,Acegi 為實現 URL 安全性提供了全面的特性。

然而,在很多企業場景中,URL 安全性還遠遠不夠。比如,假設一個 PDF 文檔包含某個制造業公司生產的特殊產品的數據。文檔的一部分包含了將由該公司的設計部門編輯和更新的設計數據。另一部分包含了生產經理將使用的生產數據。對于諸如此類的場景,需要實現更加細粒度的安全性,對文檔的不同部分應用不同的訪問權限。

本文介紹了 Acegi 為實現 URL 安全性而提供的各種功能。本系列的下一篇文章將演示此框架的基于方法的安全性,它提供了對企業數據訪問的更細粒度的控制。

Acegi Security System

Acegi Security System 使用安全過濾器來提供企業應用程序的身份驗證和授權服務。該框架提供了不同類型的過濾器,可以根據應用程序的需求進行配置。您將在本文后面了解到?安全過濾器的不同類型;現在,只需注意可以為如下任務配置 Acegi 安全過濾器:

  • 在訪問一個安全資源之前提示用戶登錄。
  • 通過檢查安全標記(如密碼),對用戶進行身份驗證。
  • 檢查經過身份驗證的用戶是否具有訪問某個安全資源的特權。
  • 將成功進行身份驗證和授權的用戶重定向到所請求的安全資源。
  • 對不具備訪問安全資源特權的用戶顯示 Access Denied 頁面。
  • 在服務器上記錄成功進行身份驗證的用戶,并在用戶的客戶機上設置安全 cookie。使用該 cookie 執行下一次身份驗證,而無需要求用戶登錄。
  • 將身份驗證信息存儲在服務器端的會話對象中,從而安全地進行對資源的后續請求。
  • 在服務器端對象中構建并保存安全信息的緩存,從而優化性能。
  • 當用戶退出時,刪除為用戶安全會話而保存的服務器端對象。
  • 與大量后端數據存儲服務(如目錄服務或關系數據庫)進行通信,這些服務用于存儲用戶的安全信息和 ECM 的訪問控制策略。
  • 正如這個列表顯示的那樣,Acegi 的安全過濾器允許您執行保護企業應用程序所需的幾乎任何事情。

    架構和組件

    對 Acegi 了解越多,使用起來就越簡單。這一節介紹 Acegi 的組件;接下來您將了解該框架如何使用反轉控制(IOC)和 XML 配置文件來組合組件并表示它們的依賴關系。

    四大組件

    Acegi Security System 由四種主要類型的組件組成:過濾器、管理器、提供者和處理程序。

    過濾器
    這種最高級的組件提供了常見的安全服務,如身份驗證、會話處理以及注銷。我將在?本文后面的部分?深入討論過濾器。
    管理器
    過濾器僅是安全相關功能的高級抽象:實際上要使用管理器和提供者實現身份驗證處理和注銷服務。管理器管理由不同提供者提供的較低級的安全服務。
    提供者
    有大量的提供者可用于和不同類型的數據存儲服務通信,例如目錄服務、關系數據庫或簡單的內存中的對象。這意味著您可以將用戶庫和訪問控制協議存儲在任何一種這樣的數據存儲服務中,并且 Acegi 的管理器將在運行時選擇合適的提供者。
    處理程序
    有時任務可能會被分解為多個步驟,其中每個步驟由一個特定的處理程序執行。比方說,Acegi 的?注銷過濾器?使用兩個處理程序來退出一個 HTTP 客戶機。其中一個處理程序使用戶的 HTTP 會話無效,而另一個處理程序則刪除用戶的 cookie。當根據應用程序需求配置 Acegi 時,多個處理程序能夠提供很好的靈活性。您可以使用自己選擇的處理程序來執行保護應用程序所需的步驟。

    反轉控制

    Acegi 的組件通過彼此之間的依賴來對企業應用程序進行保護。比如,一個身份驗證處理過濾器需要一個身份驗證管理器選擇一個合適的身份驗證提供者。這就是說您必須能夠表示和管理 Acegi 組件的依賴關系。

    IOC 實現通常用于管理 Java 組件之間的依賴關系。IOC 提供了兩個重要的特性:

  • 它提供了一種語法,表示應用程序所需的組件以及這些組件如何相互依賴。
  • 它保證了所需的組件在運行時是可用的。
  • XML 配置文件

    Acegi 使用 Spring 框架(請參見?參考資料)附帶的流行開源 IOC 實現來管理其組件。Spring 需要您編寫一個 XML 配置文件來表示組件的依賴關系,如清單 1 所示:

    清單 1. Spring 配置文件的結構
    <beans><bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"><property name="filterInvocationDefinitionSource"><value> value here </value></property></bean><bean id="authenticationProcessingFilter"class="org.acegisecurity.ui.webapp.AuthenticationProcessingFitler"><property name="authenticationManager" ref="authManager"/><!-- Other properties --></bean><bean id="authManager"class="org.acegisecurity.providers.ProviderManager"><property name="providers"><!-- List of providers here --></property></bean><!-- Other bean tags --> </beans>

    如您所見,Acegi 使用的 Spring XML 配置文件包含一個?<beans>?標記,它封裝了一些其他的?<bean>?標記。所有的 Acegi 組件(即過濾器、管理器、提供者等)實際上都是 JavaBean。XML 配置文件中的每個?<bean>?標記都代表一個 Acegi 組件。

    進一步解釋 XML 配置文件

    首先將注意到的是每個?<bean>?標記都包含一個?class?屬性,這個屬性標識組件所使用的類。<bean>?標記還具有一個?id?屬性,它標識作為 Acegi 組件工作的實例(Java 對象)。

    比方說,清單 1?的第一個?<bean>?標記標識了名為?filterChainProxy?的組件實例,它是名為?org.acegisecurity.util.FilterChainProxy的類的實例。

    使用?<bean>?標記的子標記來表示 bean 的依賴關系。比如,注意第一個?<bean>?標記的?<property>?子標記。<property>?子標記定義了<bean>?標記依賴的其他 bean 或值。

    所以在?清單 1?中,第一個?<bean>?標記的?<property>?子標記具有一個 name 屬性和一個?<value>?子標記,分別定義了這個 bean 依賴的屬性的名稱和值。

    同樣,清單 1?中的第二個和第三個?<bean>?標記定義了一個過濾器 bean 依賴于一個管理器 bean。第二個?<bean>?標記表示過濾器 bean,而第三個?<bean>?標記表示管理器 bean。

    過濾器的?<bean>?標記包含一個?<property>?子標記,該子標記具有兩個屬性:name?和?ref。name?屬性定義了過濾器 bean 的屬性,而?ref?屬性引用了管理器 bean 的實例(名稱)。

    下一節將展示如何在 XML 配置文件中配置 Acegi 過濾器。在本文后面的內容中,您將在一個樣例 Acegi 應用程序中使用過濾器。

    安全過濾器

    正如我前面提到的一樣,Acegi 使用安全過濾器為企業應用程序提供身份驗證和授權服務。您可以根據應用程序的需要使用和配置不同類型的過濾器。這一節將介紹五種最重要的 Acegi 安全過濾器。

    Session Integration Filter

    Acegi 的?Session Integration Filter(SIF)通常是您將要配置的第一個過濾器。SIF 創建了一個安全上下文對象,這是一個與安全相關的信息的占位符。其他 Acegi 過濾器將安全信息保存在安全上下文中,也會使用安全上下文中可用的安全信息。

    SIF 創建安全上下文并調用過濾器鏈中的其他過濾器。然后其他過濾器檢索安全上下文并對其進行更改。比如,Authentication Processing Filter(我將稍后進行介紹)將用戶信息(如用戶名、密碼和電子郵件地址)存儲在安全上下文中。

    當所有的處理程序完成處理后,SIF 檢查安全上下文是否更新。如果任何一個過濾器對安全上下文做出了更改,SIF 將把更改保存到服務器端的會話對象中。如果安全上下文中沒有發現任何更改,那么 SIF 將刪除它。

    在 XML 配置文件中對 SIF 進行了配置,如清單 2 所示:

    清單 2. 配置 SIF
    <bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"/>

    Authentication Processing Filter

    Acegi 使用?Authentication Processing Filter(APF)進行身份驗證。APF 使用一個身份驗證(或登錄)表單,用戶在其中輸入用戶名和密碼,并觸發身份驗證。

    APF 執行所有的后端身份驗證處理任務,比如從客戶機請求中提取用戶名和密碼,從后端用戶庫中讀取用戶參數,以及使用這些信息對用戶進行身份驗證。

    在配置 APF 時,您必須提供如下參數:

    • Authentication manager?指定了用來管理身份驗證提供者的身份驗證管理器。
    • Filter processes URL?指定了客戶在登錄窗口中按下?Sign In?按鈕時要訪問的 URL。收到這個 URL 的請求后,Acegi 立即調用 APF。
    • Default target URL?指定了成功進行身份驗證和授權后呈現給用戶的頁面。
    • Authentication failure URL?指定了身份驗證失敗情況下用戶看到的頁面。

    APF 從用戶的請求對象中得到用戶名、密碼和其他信息。它將這些信息傳送給身份驗證管理器。身份驗證管理器使用適當的提供者從后端用戶庫中讀取詳細的用戶信息(如用戶名、密碼、電子郵件地址和用戶訪問權利或特權),對用戶進行身份驗證,并將信息存儲在一個Authentication?對象中。

    最后,APF 將?Authentication?對象保存在 SIF 之前創建的安全上下文中。存儲在安全上下文中的?Authentication?對象將用于做出授權決策。

    APF 的配置如清單 3 所示:

    清單 3. 配置 APF
    <bean id="authenticationProcessingFilter"class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"><property name="authenticationManager"ref="authenticationManager" /><property name="filterProcessesUrl"value="/j_acegi_security_check" /><property name="defaultTargetUrl"value="/protected/protected1.jsp" /><property name="authenticationFailureUrl"value="/login.jsp?login_error=1" /> </bean>

    可以從這段代碼中看到,APF 依賴于上面討論的這四個參數。每個參數都是作為清單 3 所示的?<property>?標記配置的。

    Logout Processing Filter

    Acegi 使用一個?Logout Processing Filer(LPF)管理注銷處理。當客戶機發來注銷請求時,將使用 LPF 進行處理。它標識了來自由客戶機所調用 URL 的注銷請求。

    LPF 的配置如清單 4 所示:

    清單 4. 配置 LPF
    <bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter"><constructor-arg value="/logoutSuccess.jsp"/><constructor-arg><list><bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/></list></constructor-arg> </bean>

    可以看到 LPF 在其構造方法中包含兩個參數:注銷成功 URL(/logoutSuccess.jsp)和處理程序列表。注銷成功 URL 用來在注銷過程完成后重定向客戶機。處理程序執行實際的注銷過程;我在這里只配置了一個處理程序,因為只需一個處理程序就可以使 HTTP 會話變為無效。我將在本系列下一篇文章中討論更多的處理程序。

    Exception Translation Filter

    Exception Translation Filter(ETF)處理身份驗證和授權過程中的異常情況,比如授權失敗。在這些異常情況中,ETF 將決定如何進行操作。

    比如,如果一個沒有進行身份驗證的用戶試圖訪問受保護的資源,ETF 將顯示一個登錄頁面要求用戶進行身份驗證。類似地,在授權失敗的情況下,可以配置 ETF 來呈現一個 Access Denied 頁面。

    ETF 的配置如清單 5 所示:

    清單 5. 配置 ETF
    <bean id="exceptionTranslationFilter"class="org.acegisecurity.ui.ExceptionTranslationFilter"><property name="authenticationEntryPoint"><bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"><property name="loginFormUrl" value="/login.jsp" /></bean></property><property name="accessDeniedHandler"><bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl"><property name="errorPage" value="/accessDenied.jsp" /></bean></property> </bean>

    正如清單 5 所示,ETF 包含兩個參數,名為?authenticationEntryPoint?和?accessDeniedHandler。authenticationEntryPoint?屬性指定登錄頁面,而?accessDeniedHandler?指定 Access Denied 頁面。

    攔截過濾器

    Acegi 的攔截過濾器?用于做出授權決策。您需要在 APF 成功執行身份驗證后對攔截過濾器進行配置,以使其發揮作用。攔截器使用應用程序的訪問控制策略來做出授權決定。

    本系列的下一篇文章將展示如何設計訪問控制策略,如何將它們托管在目錄服務中,以及如何配置 Acegi 以讀取您的訪問控制策略。但是,目前我將繼續向您展示如何使用 Acegi 配置一個簡單的訪問控制策略。在本文后面的部分,您將看到使用簡單的訪問控制策略構建一個樣例應用程序。

    配置簡單的訪問控制策略可分為兩個步驟:

  • 編寫訪問控制策略。
  • 根據策略配置 Acegi 的攔截過濾器。
  • 步驟 1. 編寫簡單的訪問控制策略

    首先看一下?清單 6,它展示了如何定義一個用戶及其用戶角色:

    清單 6. 為用戶定義簡單的訪問控制策略
    alice=123,ROLE_HEAD_OF_ENGINEERING

    清單 6 所示的訪問控制策略定義了用戶名?alice,它的密碼是?123,角色是?ROLE_HEAD_OF_ENGINEERING。(下一節將說明如何在文件中定義任意數量的用戶及其用戶角色,然后配置攔截過濾器以使用這些文件。)

    步驟 2. 配置 Acegi 的攔截過濾器

    攔截過濾器使用三個組件來做出授權決策,我在清單 7 中對其進行了配置:

    清單 7. 配置攔截過濾器
    <bean id="filterInvocationInterceptor"class="org.acegisecurity.intercept.web.FilterSecurityInterceptor"><property name="authenticationManager" ref="authenticationManager" /><property name="accessDecisionManager" ref="accessDecisionManager" /><property name="objectDefinitionSource"><value>CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISONPATTERN_TYPE_APACHE_ANT/protected/**=ROLE_HEAD_OF_ENGINEERING/**=IS_AUTHENTICATED_ANONYMOUSLY</value></property><!-- More properties of the interceptor filter --> </bean>

    如清單 7 所示,配置所需的三個組件是?authenticationManager、accessDecisionManager、objectDefinitionSource:

    • authenticationManager?組件與我在介紹?Authentication Processing Filter?時討論過的身份驗證管理器相同。攔截過濾器可以在授權的過程中使用?authenticationManager?重新對客戶機進行身份驗證。
    • accessDecisionManager?組件管理授權過程,這部分內容將在本系列的下篇文章中詳細討論。
    • objectDefinitionSource?組件包含對應于將要發生的授權的訪問控制定義。例如,清單 7?中的?objectDefinitionSource?屬性值包含兩個 URL(/protected/*?和?/*)。其值定義了這些 URL 的角色。/protected/*?URL 的角色是?ROLE_HEAD_OF_ENGINEERING。您可以根據應用程序的需要定義任何角色。

      回想一下?清單 6,您為用戶名?alice?定義了?ROLE_HEAD_OF_ENGINEERING。這就是說?alice?將能夠訪問?/protected/*?URL。

    過濾器工作原理

    正如您已經了解到的一樣,Acegi 的組件彼此依賴,從而對您的應用程序進行保護。在本文后面的部分,您將看到如何對 Acegi 進行配置,從而按照特定的順序應用安全過濾器,因此需要創建過濾器鏈。出于這個目的,Acegi 保存了一個過濾器鏈對象,它封裝了為保護應用程序而配置了的所有過濾器。圖 1 展示了 Acegi 過濾器鏈的生命周期,該周期從客戶機向您的應用程序發送 HTTP 請求開始。(圖 1 顯示了服務于瀏覽器客戶機的容器。)

    圖 1. 托管 Acegi 過濾器鏈以安全地為瀏覽器客戶機服務的容器

    下面的步驟描述了過濾器鏈的生命周期:

  • 瀏覽器客戶機向您的應用程序發送 HTTP 請求。
  • 容器接收到 HTTP 請求并創建一個請求對象,該對象將封裝 HTTP 請求中包含的信息。容器還創建一個各種過濾器都可處理的響應對象,從而為發出請求的客戶機準備好 HTTP 響應。容器然后調用 Acegi 的過濾器鏈代理,這是一個代理過濾器。該代理知道應用的過濾器的實際順序。當容器調用代理時,它將向代理發送請求、響應以及過濾器鏈對象。
  • 代理過濾器調用過濾器鏈中第一個過濾器,向其發送請求、響應和過濾器鏈對象。
  • 鏈中的過濾器逐個執行其處理。一個過濾器可以通過調用過濾器鏈中下一個過濾器隨時終止自身處理。有的過濾器甚至根本不執行任何處理(比如,如果 APF 發現一個到來的請求沒有要求身份驗證,它可能會立即終止其處理)。
  • 當身份驗證過濾器完成其處理時,這些過濾器將把請求和響應對象發送到應用程序中配置的攔截過濾器。
  • 攔截器決定是否對發出請求的客戶機進行授權,使它訪問所請求的資源。
  • 攔截器將控制權傳輸給應用程序(比如,成功進行了身份驗證和授權的客戶機請求的 JSP 頁面)。
  • 應用程序改寫響應對象的內容。
  • 響應對象已經準備好了,容器將響應對象轉換為 HTTP 響應,并將響應發送到發出請求的客戶機。
  • 為幫助您進一步理解 Acegi 過濾器,我將詳細探討其中兩個過濾器的操作:Session Integration Filter 和 Authentication Processing Filter。

    SIF 如何創建一個安全上下文

    圖 2 展示了 SIF 創建安全上下文所涉及到的步驟:

    圖 2. SIF 創建安全上下文

    現在詳細地考慮下面這些步驟:

  • Acegi 的過濾器鏈代理調用 SIF 并向其發送請求、響應和過濾器鏈對象。注意:通常將 SIF 配置為過濾器鏈中第一個過濾器。
  • SIF 檢查它是否已經對這個 Web 請求進行過處理。如果是的話,它將不再進一步進行處理,并將控制權傳輸給過濾器鏈中的下一個過濾器(參見下面的第 4 個步驟)。如果 SIF 發現這是第一次對這個 Web 請求調用 SIF,它將設置一個標記,將在下一次使用該標記,以表示曾經調用過 SIF。
  • SIF 將檢查是否存在一個會話對象,以及它是否包含安全上下文。它從會話對象中檢索安全上下文,并將其放置在名為?security context holder?的臨時占位符中。如果不存在會話對象,SIF 將創建一個新的安全上下文,并將它放到 security context holder 中。注意:security context holder 位于應用程序的范圍內,所以可以被其他的安全過濾器訪問。
  • SIF 調用過濾器鏈中的下一個過濾器。
  • 其他過濾器可以編輯安全上下文。
  • SIF 在過濾器鏈完成處理后接收控制權。
  • SIF 檢查其他的過濾器是否在其處理過程中更改了安全上下文(比如,APF 可能將用戶詳細信息存儲在安全上下文中)。如果是的話,它將更新會話對象中的安全上下文。就是說在過濾器鏈處理過程中,對安全上下文的任何更改現在都保存在會話對象中。
  • APF 如何對用戶進行身份驗證

    圖 3 展示了 APF 對用戶進行身份驗證所涉及到的步驟:

    圖 3. APF 對用戶進行身份驗證

    現在仔細考慮以下這些步驟:

  • 過濾器鏈中前面的過濾器向 APF 發送請求、響應和過濾鏈對象。
  • APF 使用從請求對象中獲得的用戶名、密碼以及其他信息創建身份驗證標記。
  • APF 將身份驗證標記傳遞給身份驗證管理器。
  • 身份驗證管理器可能包含一個或更多身份驗證提供者。每個提供者恰好支持一種類型的身份驗證。管理器檢查哪一種提供者支持它從 APF 收到的身份驗證標記。
  • 身份驗證管理器將身份驗證標記發送到適合進行身份驗證的提供者。
  • 身份驗證提供者支持從身份驗證標記中提取用戶名,并將它發送給名為?user cache service?的服務。Acegi 緩存了已經進行過身份驗證的用戶。該用戶下次登錄時,Acegi 可以從緩存中加載他或她的詳細信息(比如用戶名、密碼和權限),而不是從后端數據存儲中讀取數據。這種方法使得性能得到了改善。
  • user cache service 檢查用戶的詳細信息是否存在于緩存中。
  • user cache service 將用戶的詳細信息返回給身份驗證提供者。如果緩存不包含用戶詳細信息,則返回 null。
  • 身份驗證提供者檢查緩存服務返回的是用戶的詳細信息還是 null。
  • 如果緩存返回 null,身份驗證提供者將用戶名(在步驟 6 中提取)發送給另一個名為?user details service?的服務。
  • user details service 與包含用戶詳細信息的后端數據存儲通信(如目錄服務)。
  • user details service 返回用戶的詳細信息,或者,如果找不到用戶詳細信息則拋出身份驗證異常。
  • 如果 user cache service 或者 user details service 返回有效的用戶詳細信息,身份驗證提供者將使用 user cache service 或 user details service 返回的密碼來匹配用戶提供的安全標記(如密碼)。如果找到一個匹配,身份驗證提供者將用戶的詳細信息返回給身份驗證管理器。否則的話,則拋出一個身份驗證異常。
  • 身份驗證管理器將用戶的詳細信息返回給 APF。這樣用戶就成功地進行了身份驗證。
  • APF 將用戶詳細信息保存在?圖 2?所示由步驟 3 創建的安全上下文中。
  • APF 將控制權傳輸給過濾器鏈中的下一個過濾器。
  • 一個簡單的 Acegi 應用程序

    在本文中,您已經了解了很多關于 Acegi 的知識,所以現在看一下利用您目前學到的知識能做些什么,從而結束本文。對于這個簡單的演示,我設計了一個樣例應用程序(參見?下載),并對 Acegi 進行了配置以保護它的一些資源。

    樣例應用程序包含 5 個 JSP 頁面:index.jsp、protected1.jsp、protected2.jsp、login.jsp 和 accessDenied.jsp。

    index.jsp 是應用程序的歡迎頁面。它向用戶顯示了三個超鏈接,如圖 4 所示:

    圖 4. 樣例應用程序的歡迎頁面:

    圖 4 所示的鏈接中,其中兩個鏈接指向了被保護的資源(protected1.jsp 和 protected2.jsp),第三個鏈接指向登錄頁面(login.jsp)。只有在 Acegi 發現用戶沒有被授權訪問受保護的資源時,才會顯示 accessDenied.jsp 頁面。

    如果用戶試圖訪問任何受保護的頁面,樣例應用程序將顯示登錄頁面。當用戶使用登錄頁面進入后,應用程序將自動重定向到被請求的受保護資源。

    用戶可以通過單擊歡迎頁面中的第三個鏈接直接請求登錄頁面。這種情況下,應用程序顯示用戶可以進入系統的登錄頁面。進入系統以后,應用程序將用戶重定向到 protected1.jsp,它是用戶進入系統而沒有請求特定的受保護資源時顯示的默認資源。

    配置樣例應用程序

    為本文下載的源代碼包含一個名為 acegi-config.xml 的 XML 配置文件,它包含 Acegi 過濾器的配置。根據?安全過濾器的討論?中的示例,您應該很熟悉這些配置。

    我還為樣例應用程序編寫了一個?web.xml?文件,如清單 8 所示:

    清單 8. 樣例應用程序的 web.xml 文件
    <web-app><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/acegi-config.xml</param-value></context-param><filter><filter-name>Acegi Filter Chain Proxy</filter-name><filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class><init-param><param-name>targetClass</param-name><param-value>org.acegisecurity.util.FilterChainProxy</param-value></init-param></filter><filter-mapping><filter-name>Acegi Filter Chain Proxy</filter-name><url-pattern>/*</url-pattern></filter-mapping><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener> </web-app>

    web.xml 文件配置如下:

    • acegi-config.xml?文件的 URL 位于?<context-param>?標記中。
    • Acegi 過濾器鏈代理類的名稱位于?<filter>?標記中。
    • URL 到 Acegi 過濾器鏈代理的映射在?<filter-mapping>?標記中。注意:您可以簡單地將應用程序的所有 URL(/*)映射到 Acegi 過濾器鏈代理。Acegi 將對映射到 Acegi 過濾器鏈代理上的所有 URL 應用安全性。
    • 應用程序上下文加載程序位于?<listener>?標記中,它將加載 Spring 的 IOC 框架。

    部署并運行應用程序

    部署并運行樣例應用程序非常的簡單。只需要完成兩件事情:

  • 將 acegisample.war 文件從本教程下載的源代碼中復制到安裝 Tomcat 的?webapps?目錄中。
  • 從 Acegi Security System 主頁?下載并解壓縮 acegi-security-1.0.3.zip。您將找到一個名為 acegi-security-sample-tutorial.war 的樣例應用程序。解壓縮 war 文件并提取其 WEB-INF/lib 文件夾中所有的 jar 文件。將所有的 JAR 文件從 WEB-INF/lib 文件夾中復制到 theacegisample.war 應用程序的 WEB-INF/lib 文件夾。
  • 現在,您已經為運行樣例應用程序做好準備了。啟動 Tomcat 并將瀏覽器指向?http://localhost:8080/acegisample/。

    您將看到?圖 4?所示的歡迎頁面,但是此時顯示的頁面是真實的。請繼續運行程序,并查看在嘗試訪問歡迎頁面顯示的不同鏈接時會發生什么狀況。

    結束語

    在使用 Acegi 保護 Java 應用程序?系列的第一篇文章中,您了解了 Acegi 安全系統的特性、架構和組件,學習了大量有關 Acegi 安全過濾器的知識,這些過濾器被集成到 Acegi 的安全框架中。您還學習了如何使用 XML 配置文件配置組件依賴關系,并查看了 Acegi 的安全過濾器在樣例程序中工作的情形,該應用程序可以實現基于 URL 的安全性。

    本文所述的安全技術非常的簡單,所以 Acegi 使用這些技術實現安全性。本系列的下一文章將開始介紹 Acegi 的一些較為高級的應用,首先是編寫訪問控制協議并將其存儲到目錄服務中。您還將了解到如何配置 Acegi,使它與目錄服務交互,從而實現您的訪問控制策略。

    第 2 部分: 使用 LDAP 目錄服務器

    這期共分三部分的系列文章介紹了如何使用 Acegi 安全系統保護 Java 企業應用程序。在?本系列第一篇文章?中,我介紹了 Acegi 并解釋了如何使用安全過濾器實現一個簡單的基于 URL 的安全系統。在第二篇文章中,我將討論 Acegi 的更加高級的應用,首先我將編寫一個訪問控制策略并將其存儲在 ApacheDS 中,ApacheDS 是一個開源的 LDAP 目錄服務器。我還將展示配置 Acegi 的方法,使它能夠與目錄服務器交互并實現您的訪問控制策略。本文的結尾提供了一個示例應用程序,它使用 ApacheDS 和 Acegi 實現了一個安全的訪問控制策略。

    實現訪問控制策略通常包含兩個步驟:

  • 將有關用戶和用戶角色的數據存儲在目錄服務器中。
  • 編寫安全代碼,它將定義有權訪問并使用數據的人員。
  • Acegi 將減輕代碼編寫的工作,因此在這篇文章中,我將展示如何將用戶和用戶角色信息存儲到 ApacheDS 中,然后實現這些信息的訪問控制策略。在該系列的最后一篇文章中,我將展示如何配置 Acegi,實現對 Java 類的安全訪問。

    您可以在本文的任何位置?下載樣例應用程序。參見?參考資料?下載 Acegi、Tomcat 和 ApacheDS,您需要使用它們運行樣例代碼和示例應用程序。

    LDAP 基礎知識

    輕量級目錄訪問協議(Lightweight Directory Access Protocol,LDAP)可能是最流行的一種定義數據格式的協議,它針對常見的目錄操作,例如對存儲在目錄服務器中的信息執行的讀取、編輯、搜索和刪除操作。本節將簡要解釋為什么目錄服務器是屬性文件存儲安全信息的首選,并展示如何在 LDAP 目錄中組織和托管用戶信息。

    為什么要使用目錄服務器?

    本系列第一部分向您介紹了一種簡單的方法,可以將用戶信息以屬性文件的形式保存起來(參見?第 1 部分,清單 6)。屬性文件以文本格式保存用戶名、密碼和用戶角色。對于大多數真實應用程序而言,使用屬性文件存儲安全信息遠遠不夠。各種各樣的理由表明,目錄服務器通常都是更好的選擇。其中一個原因是,真實的企業應用程序可以被大量用戶訪問 —— 通常是幾千名用戶,如果應用程序將其部分功能公開給用戶和供應商時更是如此。頻繁搜索文本文件中隨意存儲的信息,這樣做的效率并不高,但是目錄服務器對這類搜索進行了優化。

    第 1 部分的清單 6?中的屬性文件演示了另一個原因,該文件組合了用戶和角色。在真實的訪問控制應用程序中,您通常都需要分別定義和維護用戶和角色信息,這樣做可以簡化用戶庫的維護。目錄服務器為更改或更新用戶信息提供了極大的靈活性,例如,反映職位升遷或新聘用人員。參見?參考資料?以了解更多關于目錄服務器的使用及其優點的信息。

    LDAP 目錄設置

    如果希望將用戶信息存儲在一個 LDAP 目錄中,您需要理解一些有關目錄設置的內容。本文并沒有提供對 LDAP 的完整介紹(參見?參考資料),而是介紹了一些在嘗試結合使用 Acegi 和 LDAP 目錄之前需要了解的基本概念。

    LDAP 目錄以節點樹的形式存儲信息,如圖 1 所示:

    圖 1. LDAP 目錄的樹狀結構

    在圖 1 中,根節點的名稱為?org。根節點可以封裝與不同企業有關的數據。例如,本系列第 1 部分開發的制造業企業被顯示為?org?節點的直接子節點。該制造業企業具有兩個名為?departments?和?partners?的子節點。

    partners?子節點封裝了不同類型的合作伙伴。圖 1 所示的三個分別為?customers、employees?和?suppliers。注意,這三種類型的合作伙伴其行為與企業系統用戶一樣。每一種類型的用戶所扮演的業務角色不同,因此訪問系統的權利也不同。

    類似地,departments?節點包含該制造業企業的不同部門的數據 —— 例如?engineering?和?marketing?字節點。每個部門節點還包含一組或多組用戶。在?圖 1?中,engineers?組是?engineering?部門的子節點。

    假設每個部門的子節點表示一組用戶。因此,部門節點的子節點具有不同的用戶成員。例如,設計部門的所有工程師都是?engineering?部門內engineers?組的成員。

    最后,注意?圖 1?中?departments?節點的最后一個子節點。specialUser?是一名用戶,而非一組用戶。在目錄設置中,像?alice?和?bob?之類的用戶一般都包含在?partners?節點中。我將這個特殊用戶包含在?departments?節點中,以此證明 Acegi 允許用戶位于 LADP 目錄中任何地點的靈活性。稍后在本文中,您將了解如何配置 Acegi 以應用?specialUser。

    使用專有名稱

    LDAP 使用專有名稱(DN)的概念來識別 LDAP 樹上特定的節點。每個節點具有惟一的 DN,它包含該節點完整的層次結構信息。例如,圖 2 展示了圖 1 中的一些節點的 DN:

    圖 2. LDAP 目錄節點的專有名稱

    首先,注意圖 2 中根節點的 DN。它的 DN 為?dc=org,這是與?org?根節點相關的屬性值對。每個節點都有若干個與之相關的屬性。dc?屬性代表 “domain component” 并由 LDAP RFC 2256 定義(參見?參考資料?中有關官方 RFC 文檔的鏈接),LDAP 目錄中的根節點通常表示為一個域組件。

    每個 LDAP 屬性是由 RFC 定義的。LDAP 允許使用多個屬性創建一個 DN,但是本文的示例只使用了以下 4 個屬性:

    • dc(域組件)
    • o(組織)
    • ou(組織單元)
    • uid(用戶 ID)

    示例使用?dc?表示域,用?o?表示組織名稱,ou?表示組織的不同單元,而?uid?表示用戶。

    由于?org?是根節點,其 DN 只需指定自身的名稱(dc=org)。比較一下,manufacturingEnterprise?節點的 DN 是o=manufacturingEnterprise,dc=org。當向下移動節點樹時,每個父節點的 DN 被包含在其子節點的 DN 中。

    將屬性分組

    LDAP 將相關的屬性類型分到對象類中。例如,名為?organizationalPerson?的對象類所包含的屬性定義了在組織內工作的人員(例如,職稱、常用名、郵寄地址等等)。

    對象類使用繼承特性,這意味著 LDAP 定義了基類來保存常用屬性。然后子類再對基類進行擴展,使用其定義的屬性。LDAP 目錄中的單個節點可以使用若干個對象類:本文的示例使用了以下幾個對象類:

    • top?對象類是 LDAP 中所有對象類的基類。
    • 當其他對象類都不適合某個對象時,將使用?domain?對象類。它定義了一組屬性,任何一個屬性都可以用來指定一個對象。其?dc?屬性是強制性的。
    • organization?對象類表示組織節點,例如?圖 2?中的?manufacturingEnterprise。
    • organizationalUnit?對象類表示組織內的單元,例如?圖 1?中的?departments?節點及其子節點。
    • groupOfNames?對象類表示一組名稱,例如某部門職員的名稱。它具有一個?member?屬性,該屬性包含一個用戶列表。圖 1?中所有的組節點(例如?engineers?節點)使用?member?屬性指定該組的成員。而且,示例使用?groupOfNames?對象類的?ou(組織單元)屬性指定組用戶的業務角色。
    • organizationalPerson?對象類表示組織內某個職員(例如?圖 1?中的?alice?節點)。

    使用 LDAP 服務器

    在真實的應用程序中,通常將有關系統用戶的大量信息托管在一個 LDAP 目錄中。例如,將存儲每個用戶的用戶名、密碼、職稱、聯系方式和工資信息。為簡單起見,下面的例子將只向您展示如何保存用戶名和密碼。

    如前所述,示例使用 ApacheDS(一種開源的 LDAP 目錄服務器)演示了 Acegi 是如何使用 LDAP 目錄的。示例還使用了一個開源的 LDAP 客戶機(名為 JXplorer)執行簡單的目錄操作,例如將信息托管在 ApacheDS 上。參見?參考資料?以下載 ApacheDS、JXplorer 并了解更多有關兩者協作的信息。

    在 ApacheDS 創建一個根節點

    要創建?圖 1?所示的節點樹,必須首先在 ApacheDS 中創建一個根節點?org。ApacheDS 為此提供了一個 XML 配置文件。XML 配置文件定義了一組可進行配置的 bean,從而根據應用程序的需求定制目錄服務器的行為。本文只解釋創建根節點所需的配置。

    可以在 ApacheDS 安裝中的?conf?文件夾找到名為?server.xml?的 XML 配置文件。打開文件后,會發現很多 bean 配置類似于 Acegi 的過濾器配置。查找名為?examplePartitionsConfiguration?的 bean。該 bean 控制 ApacheDS 上的分區。當創建新的根節點時,實際上將在 LDAP 目錄上創建一個新的分區。

    編輯?examplePartitionConfiguration?bean 以創建?org?根節點,如清單 1 所示:

    清單 1. 編輯模式的 examplePartitionConfiguration bean 配置
    <bean id="examplePartitionConfiguration" class= "org.apache.directory.server.core.partition.impl.btree.MutableBTreePartitionConfiguration" ><property name="suffix"><value>dc=org</value></property><property name="contextEntry"> <value> objectClass: top objectClass: domain dc: org </value> </property><!-- Other properties of the examplePartitionConfiguration bean, which you don't need to edit. --></bean>

    清單 1 編輯了?examplePartitionConfiguration?bean 的兩個屬性:

    • 一個屬性名為?suffix,它定義根條目的 DN。
    • 另一個屬性名為?contextEntry,定義?org?節點將使用的對象類。注意,org?根節點使用兩個對象類:top?和?domain。

    本文的?源代碼下載?部分包含了編輯模式的 server.xml 文件。如果希望繼續學習本示例,請將 server.xml 文件從源代碼中復制到您的 ApacheDS 安裝目錄中的正確位置,即?conf?文件夾。

    圖 3 所示的屏幕截圖展示了在 ApacheDS 中創建根節點后,JXplorer 是如何顯示該根節點的:

    圖 3. JXplorer 顯示根節點

    填充服務器

    設置 LDAP 服務器的下一步是使用用戶和組信息填充服務器。您可以使用 JXplorer 在 ApacheDS 中逐個創建節點,但是使用 LDAP Data Interchange Format (LDIF) 填充服務器會更加方便。LDIF 是可被大多數 LDAP 實現識別的常見格式。developerWorks 文章很好地介紹了 LDIF 文件的內容,因此本文將不再做詳細說明。(參見?參考資料?中有關 LDIF 的詳細資料。)

    您可以在?源代碼下載?部分查看 LDIF 文件,它表示?圖 1?所示的用戶和部門。您可以使用 JXplorer 將 LDIF 文件導入到 ApacheDS。要導入 LDIF 文件,在 JXplorer 中使用?LDIF?菜單,如圖 4 所示:

    圖 4. 將 LDIF 文件導入到 ApacheDS

    將 LDIF 文件導入到 ApacheDS 之后,JXplorer 將顯示用戶節點和部門節點樹,如?圖 1?所示。現在您可以開始配置 Acegi,使其能夠與您的 LDAP 服務器通信。

    為 LDAP 實現配置 Acegi

    回想一下第 1 部分,其中 Acegi 使用身份驗證處理過濾器(Authentication Processing Filter,APF)進行身份驗證。APF 執行所有后端身份驗證處理任務,例如從客戶機請求中提取用戶名和密碼,從后端用戶庫讀取用戶參數,以及使用這些信息對用戶進行身份驗證。

    您在第 1 部分中為屬性文件實現配置了 APF,現在您已將用戶庫存儲在 LDAP 目錄中,因此必須使用不同的方式配置過濾器來和 LDAP 目錄進行通信。首先看一下清單 2,它展示了在第 1 部分中的 “Authentication Processing Filter” 一節中如何為屬性文件實現配置 APF 過濾器:

    清單 2. 為屬性文件配置 APF
    <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"><property name="authenticationManager" ref="authenticationManager" /><property name="authenticationFailureUrl" value="/login.jsp?login_error=1" /><property name="defaultTargetUrl" value="/index.jsp" /><property name="filterProcessesUrl" value="/j_acegi_security_check" /></bean>

    查看一下清單 2,您曾經為 APF 提供了 4 個參數。您只需在 LDAP 服務器中為存儲重新配置第一個參數(authenticationManager)即可。其他三個參數保持不變。

    配置身份驗證管理器

    清單 3 展示了如何配置 Acegi 的身份驗證管理器,以實現與 LDAP 服務器的通信:

    清單 3. 為 LDAP 配置 Acegi 的身份驗證管理器
    <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"><property name="providers"> <list> <ref local="ldapAuthenticationProvider" /> </list> </property></bean>

    在清單 3 中,org.acegisecurity.providers.ProviderManager?是一個管理器類,它管理 Acegi 的身份驗證過程。為此,身份驗證管理器需要一個或多個身份驗證提供者。您可以使用管理器 bean 的提供者屬性來配置一個或多個提供者。清單 3 只包含了一個提供者,即 LDAP 身份驗證提供者。

    LDAP 身份驗證提供者處理所有與后端 LDAP 目錄的通信。您必須對其進行配置,下一節內容將討論該主題。

    配置 LDAP 身份驗證提供者

    清單 4 展示了 LDAP 身份驗證提供者的配置:

    清單 4. 配置 LDAP 身份驗證提供者
    <bean id="ldapAuthenticationProvider" class="org.acegisecurity.providers.ldap.LdapAuthenticationProvider"><constructor-arg><ref local="authenticator"/></constructor-arg><constructor-arg><ref local="populator"/></constructor-arg></bean>

    注意 LDAP 身份驗證提供者類的名稱為?org.acegisecurity.providers.ldap.LdapAuthenticationProvider?。其構造函數包含兩個參數,使用兩個?<constructor-arg>?標記的形式,如清單 4 所示。

    LdapAuthenticationProvider?構造函數的第一個參數是?authenticator,該參數通過檢查用戶的用戶名和密碼對 LDAP 目錄的用戶進行身份驗證。完成身份驗證后,第二個參數?populator?將從 LDAP 目錄中檢索有關該用戶的訪問權限(或業務角色)信息。

    以下小節將向您展示如何配置驗證器和填充器 bean。

    配置驗證器

    authenticator?bean 將檢查具有給定用戶名和密碼的用戶是否存在于 LDAP 目錄中。Acegi 提供了名為org.acegisecurity.providers.ldap.authenticator.BindAuthenticator?的驗證器類,它將執行驗證用戶名和密碼所需的功能。

    配置?authenticator?bean,如清單 5 所示:

    清單 5. 配置驗證器 bean
    <bean id="authenticator" class="org.acegisecurity.providers.ldap.authenticator.BindAuthenticator"><constructor-arg><ref local="initialDirContextFactory"/></constructor-arg><property name="userDnPatterns"> <list> <value>uid={0},ou=employees,ou=partners</value> <value>uid={0},ou=customers,ou=partners</value> <value>uid={0},ou=suppliers,ou=partners</value> </list> </property><property name="userSearch"><ref local="userSearch"/></property></bean>

    在清單 5 中,BindAuthenticator?構造函數具有一個參數,使用?<constructor-arg>?標記的形式。清單 5 中參數的名稱為initialDirContextFactory。該參數實際上是另一個 bean,稍后您將學習如何配置該 bean。

    目前為止,只知道?initialDirContextFactory?bean 的作用就是為稍后的搜索操作指定初始上下文。初始上下文是一個 DN,它指定了 LDAP 目錄內某個節點。指定初始上下文后,將在該節點的子節點中執行所有的搜索操作(例如查找特定用戶)。

    例如,回到?圖 2?中查看?partners?節點,它的 DN 是?ou=partners,o=manufacturingEnterprise,dc=org。如果將?partners?節點指定為初始上下文,Acegi 將只在?partners?節點的子節點中查找用戶。

    指定 DN 模式

    除配置?BindAuthenticator?構造函數外,還必須配置?authenticator?bean 的兩個屬性(清單 5?中的兩個?<property>?標記)。

    第一個?<property>?標記定義了一個?userDnPatterns?屬性,它封裝了一個或多個 DN 模式列表。DN 模式?指定了一組具有類似特性的 LDAP 節點(例如?圖 2?所示的?employees?節點的所有子節點)。

    Acegi 的身份驗證器從?authenticator?bean 的?userDnPatterns?屬性中配置的每個 DN 模式構造了一個 DN。例如,查看?清單 5?中配置的第一個模式,即?uid={0},ou=employees,ou=partners。在進行身份驗證的時候,authenticator?bean 使用用戶提供的用戶名(比如?alice)替換了?{0}。使用用戶名取代了?{0}?之后,DN 模式將變為相對 DN(RDN)uid=alice,ou=employees,ou=partners,它需要一個初始上下文才能成為 DN。

    例如,查看?圖 2?中的?alice's?條目。該條目是?employees?節點的第一個子節點。它的 DN 是uid=alice,ou=employees,ou=partners,o=manufacturingEnterprise, dc=org。如果使用?o=manufacturingEnterprise,dc=org?作為初始上下文并將其添加到 RDN?uid=alice,ou=employees,ou=partners?之后,將獲得 alice 的 DN。

    使用這種方法通過 DN 模式構建了用戶的 DN 后,authenticator?將把 DN 和用戶密碼發送到 LDAP 目錄。目錄將檢查該 DN 是否具有正確的密碼。如果有的話,用戶就可以通過身份驗證。這個過程在 LDAP 術語中被稱為?bind 身份驗證。LDAP 還提供了其他類型的身份驗證機制,但是本文的示例只使用了 bind 身份驗證。

    如果目錄中并沒有第一個 DN 模式創建的 DN,authenticator?bean 嘗試使用列表中配置的第二個 DN 模式。依此類推,authenticator?bean 將嘗試所有的 DN 模式來為進行身份驗證的用戶構造正確的用戶 DN。

    搜索過濾器

    回想一下較早的章節 “LDAP 目錄設置”,我在將用戶信息存儲到 LDAP 目錄時添加了一點靈活性。方法是在?圖 1?所示的?departments?節點內創建一個特定用戶(specialUser)。

    如果試圖使用?清單 5?中配置的任何一種 DN 模式創建特定用戶的 DN,您會發現沒有一種 DN 模式可用。因此,當用戶嘗試登錄時,Acegi 的authenticator?bean 將不能夠構造正確的 DN,從而無法對該用戶進行身份驗證。

    通過允許您指定搜索過濾器,Acegi 能夠處理類似的特殊情況。身份驗證器 bean 使用搜索過濾器查找不能夠通過 DN 模式構造 DN 進行身份驗證的用戶。

    清單 5?中的第二個?<property>?標記具有一個?<ref>?子標記,它引用名為?userSearch?的 bean。userSearch?bean 指定搜索查詢。清單 6 展示了如何配置?userSearch?bean 來處理特定用戶:

    清單 6. 配置搜索查詢以搜索特定用戶
    <bean id="userSearch" class="org.acegisecurity.ldap.search.FilterBasedLdapUserSearch"><constructor-arg> <value>ou=departments</value> </constructor-arg><constructor-arg> <value>(uid={0})</value> </constructor-arg><constructor-arg> <ref local="initialDirContextFactory" /> </constructor-arg><property name="searchSubtree"> <value>true</value> </property></bean>

    搜索查詢的參數

    清單 6 展示了?userSearch?bean 是?org.acegisecurity.ldap.search.FilterBasedLdapUserSearch?類的一個實例,該類的構造函數具有三個參數。第一個參數指定?authenticator?在哪個節點中搜索用戶。第一個參數的值為?ou=departments,該值是一個 RDN,指定了?圖 2?所示的?departments?節點。

    第二個參數?(uid={0})?指定了一個搜索過濾器。由于使用?uid?屬性指定用戶,因此可以通過查找?uid?屬性具有特定值的節點來查找用戶。正如您所料,花括號里面的 0 向 Acegi 表示使用進行身份驗證的用戶的用戶名(本例中為?specialUser)替換?{0}。

    第三個參數是對討論?清單 5?中的?BindAuthenticator?構造函數時引入的相同初始上下文的引用。回想一下,當指定了初始上下文后,稍后將在該初始上下文節點的子節點內進行所有的搜索操作。注意,應將指定為?清單 5?中第一個參數(ou=departments)的值的 RDN 前加到初始上下文。

    除了這三個構造器參數,清單 6 所示的?userSearch?bean 還具有一個名為?searchSubtree?的屬性。如果將其值指定為?true,搜索操作將包括節點的子樹(即所有子節點、孫節點、孫節點的子節點等),該節點被指定為構造函數的第一個參數的值。

    authenticator?bean 的配置完成后,下一步將查看?populator?bean 的配置,如?清單 4?所示。

    配置 populator

    populator?bean 將讀取已經通過?authenticator?bean 身份驗證的用戶的業務角色。清單 7 展示?populator?bean 的 XML 配置:

    清單 7. populator bean 的 XML 配置
    <bean id="populator" class="org.acegisecurity.providers.ldap.populator.DefaultLdapAuthoritiesPopulator"><constructor-arg> <ref local="initialDirContextFactory"/> </constructor-arg><constructor-arg> <value>ou=departments</value> </constructor-arg><property name="groupRoleAttribute"> <value>ou</value> </property><property name="searchSubtree"> <value>true</value> </property></bean>

    在清單 7 中,populator?bean 的構造函數包括 2 個參數,以及一個?groupRoleAttribute?屬性。構造函數的第一個參數指定了?populatorbean 用來讀取經過驗證用戶的業務角色的初始上下文。并不強制要求?authenticator?和?populator?bean 使用相同的初始上下文。您可以為這兩者分別配置一個初始上下文。

    第二個構造函數參數指定了 populator 前加到初始上下文的 RDN。因此,RDN 組成了包含組用戶的節點的 DN,例如?departments?節點。

    populator?bean 的?groupRoleAttribute?屬性指定了持有組成員業務角色數據的屬性。回想?設置 LDAP 目錄?一節中,您將每組用戶的業務角色信息存儲在名為?ou?的屬性中。然后將?ou?設置為?groupRoleAttribute?屬性的值,如?清單 7?所示。

    如您所料,populator?bean 將搜索整個 LDAP 目錄來查找經過驗證的用戶所屬的組節點。然后讀取組節點的?ou?屬性的值,獲取用戶經過授權的業務角色。

    這樣就完成了?populator?bean 的配置。目前為止,我們在三個位置使用了初始上下文:清單 5、清單 6?和?清單 7。接下來將了解如何配置初始上下文。

    配置初始上下文

    清單 8 展示了在 Acegi 中配置初始上下文的過程:

    清單 8. 初始上下文的 XML 配置
    <bean id="initialDirContextFactory" class="org.acegisecurity.ldap.DefaultInitialDirContextFactory"><constructor-arg value="ldap://localhost:389/o=manufacturingEnterprise,dc=org"/><property name="managerDn"> <value>cn=manager,o=manufacturingEnterprise,dc=org</value> </property><property name="managerPassword"> <value>secret</value> </property></bean>

    清單 8 中 Acegi 的初始上下文類的名稱為?org.acegisecurity.ldap.DefaultInitialDirContextFactory,這是 Acegi 包含的工廠類。Acegi 在內部使用該類構造其他處理目錄操作(例如在整個目錄中搜索)的類的對象。當配置初始上下文工廠時,必須指定以下內容:

    • 將您的 LDAP 目錄和根目錄節點的網絡地址指定為構造函數的參數。在初始上下文配置的節點將作為根節點。就是說所有后續操作(例如search)都將在根節點定義的子樹中執行。
    • 將 DN 和密碼分別定義為?managerDn?和?managerPassword?屬性。在執行任何搜索操作之前,Acegi 必須使用目錄服務器對 DN 和密碼進行身份驗證。

    您已經了解了如何將用戶庫托管在 LDAP 目錄中,以及如何配置 Acegi 來使用來自 LDAP 目錄的信息對用戶進行身份驗證。下一節將進一步介紹 Acegi 的身份驗證處理過濾器,了解新配置的 bean 是如何管理身份驗證過程的。

    身份驗證和授權

    APF 配置完成后,將能夠與 LDAP 目錄進行通信來對用戶進行身份驗證。如果您閱讀過第 1 部分,那么對與目錄通信過程中 APF 執行的一些步驟不會感到陌生,我在第 1 部分中向您展示了過濾器如何使用不同的服務進行用戶身份驗證。圖 5 所示的序列表與您在?第 1 部分圖 3?看到的非常類似:

    圖 5. APF 對一名 LDAP 用戶進行身份驗證

    無論 APF 使用屬性文件進行內部的身份驗證還是與 LDAP 服務器進行通信,步驟 1 到步驟 9 與第 1 部分是相同的。這里簡單描述了前 9 個步驟,您可以從步驟 10 開始繼續學習特定于 LDAP 的事件:

  • 過濾器鏈前面的過濾器將請求、響應和過濾器鏈對象傳遞給 APF。
  • APF 使用取自請求對象的用戶名、密碼和其他信息創建一個身份驗證標記。
  • APF 將身份驗證標記傳遞給身份驗證管理器。
  • 身份驗證管理器可能包含一個或多個身份驗證提供者。每個提供者恰好支持一種身份驗證類型。管理器將檢查哪一種提供者支持從 APF 接收到的身份驗證標記。
  • 身份驗證管理器將身份驗證標記傳遞給適合該類型身份驗證的提供者。
  • 身份驗證提供者從身份驗證標記中提取用戶名并將其傳遞到名為 user cache service 的服務。Acegi 緩存了已經進行過身份驗證的用戶。該用戶下次登錄時,Acegi 可以從緩存中加載他或她的詳細信息(比如用戶名、密碼和權限),而不是從后端數據存儲中讀取數據。這種方法使得性能得到了改善。
  • user cache service 檢查用戶的詳細信息是否存在于緩存中。
  • user cache service 將用戶的詳細信息返回給身份驗證提供者。如果緩存不包含用戶詳細信息,則返回 null。
  • 身份驗證提供者檢查緩存服務返回的是用戶的詳細信息還是 null。
  • 從這里開始,身份驗證處理將特定于 LDAP。?如果緩存返回 null,LDAP 身份驗證提供者將把用戶名(在步驟 6 中提取的)和密碼傳遞給清單 5?中配置的?authenticator?bean。
  • authenticator?將使用在?清單 5?的?userDnPatterns?屬性中配置的 DN 模式創建用戶 DN。通過從一個 DN 模式中創建一個 DN,然后將該 DN 和用戶密碼(從用戶請求中獲得)發送到 LDAP 目錄,它將逐一嘗試所有可用的 DN 模式。LDAP 目錄將檢查該 DN 是否存在以及密碼是否正確。如果其中任何一個 DN 模式可行的話,用戶被綁定到 LDAP 目錄中,authenticator?將繼續執行步驟 15。
  • 如果任何一種 DN 模式都不能工作的話(這意味著在 DN 模式指定的任何位置都不存在使用給定密碼的用戶),authenticator?根據?清單 6配置的搜索查詢在 LDAP 目錄中搜索用戶。如果 LDAP 目錄沒有找到用戶,那么身份驗證以失敗告終。
  • 如果 LDAP 目錄查找到了用戶,它將用戶的 DN 返回到?authenticator。
  • authenticator?將用戶 DN 和密碼發送到 LDAP 目錄來檢查用戶密碼是否正確。如果 LDAP 目錄發現用戶密碼是正確的,該用戶將被綁定到 LDAP 目錄。
  • authenticator?將用戶信息發送回 LDAP 身份驗證提供者。
  • LDAP 身份驗證提供者將控制權傳遞給?populator?bean。
  • populator?搜索用戶所屬的組。
  • LDAP 目錄將用戶角色信息返回給?populator。
  • populator?將用戶角色信息返回給 LDAP 身份驗證提供者。
  • LDAP 身份驗證提供者將用戶的詳細信息(以及用戶業務角色信息)返回給 APF。用戶現在成功進行了身份驗證。
  • 不論使用何種身份驗證方法,最后三個步驟是相同的(步驟21、21 和 23)。

    配置攔截器

    您已經了解了 APF 對用戶進行身份驗證的步驟。接下來是查看成功進行身份驗證的用戶是否被授權訪問所請求的資源。這項任務由 Acegi 的攔截過濾器(Interceptor Filter,IF)完成。本節將向您展示如何配置 IF 來實現訪問控制策略。

    回想一下在?第 1 部分的清單 7?中配置 IF 的步驟。攔截過濾器在資源和角色之間建立映射,就是說只有具備必要角色的用戶才能訪問給定資源。為了演示制造業企業中不同部門的業務角色,清單 9 向現有的 IF 配置添加了另外的角色:

    清單 9. 配置攔截過濾器
    <bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor"><property name="authenticationManager" ref="authenticationManager" /><property name="accessDecisionManager" ref="accessDecisionManager" /><property name="objectDefinitionSource"> <value> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /protected/engineering/**=ROLE_HEAD_OF_ENGINEERING /protected/marketing/**=ROLE_HEAD_OF_MARKETING /**=IS_AUTHENTICATED_ANONYMOUSLY </value> </property></bean>

    在清單 9 中,IF 包含三個參數。其中第一個和第三個參數與第 1 部分中最初配置的參數相同。這里添加了第二個參數(名為accessDecisionManager?的 bean)。

    accessDecisionManager?bean 負責指定授權決策。它使用清單 9 中第三個參數提供的訪問控制定義來指定授權(或訪問控制)決策。第三個參數是?objectDefinitionSource。

    配置訪問決策管理器

    accessDecisionManager?決定是否允許一個用戶訪問某個資源。Acegi 提供了一些訪問決策管理器,它們指定訪問控制決策的方式有所不同。本文只解釋了其中一種訪問決策管理器的工作方式,其配置如清單 10 所示:

    清單 10. 配置訪問決策管理器
    <bean id="accessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased"><property name="decisionVoters"> <list> <bean class="org.acegisecurity.vote.RoleVoter"/> <bean class="org.acegisecurity.vote.AuthenticatedVoter" /> </list> </property></bean>

    在清單 10 中,accessDecisionManager?bean 是?org.acegisecurity.vote.AffirmativeBased?類的實例。accessDecisionManager?bean 只包含一個參數,即投票者(voter)列表。

    在 Acegi 中,投票者確定是否允許某個用戶訪問特定的資源。當使用?accessDecisionManager?查詢時,投票者具有三個選項:允許訪問(access-granted)、拒絕訪問(access-denied),如果不確定的話則放棄投票(abstain from voting)。

    不同類型的訪問決策管理器解釋投票者決策的方法也有所不同。清單 10 所示的?AffirmativeBased?訪問決策管理器實現了簡單的決策邏輯:如果任何投票者強制執行肯定投票,將允許用戶訪問所請求的資源。

    投票者邏輯

    Acegi 提供了若干個投票者實現類型。accessDecisionManager?將經過驗證的用戶的信息(包括用戶的業務角色信息)和objectDefinitionSource?對象傳遞給投票者。本文的示例使用了兩種類型的投票者,RoleVoter?和?AuthenticatedVoter,如清單 10 所示。現在看一下每種投票者的邏輯:

    • RoleVoter?只有在?objectDefinitionSource?對象的行中找到以?ROLE_?前綴開頭的角色時才進行投票。如果?RoleVoter?沒有找到這樣的行,將放棄投票;如果在用戶業務角色中找到一個匹配的角色,它將投票給允許訪問;如果沒有找到匹配的角色,則投票給拒絕訪問。在?清單 9?中,有兩個角色具有?ROLE_?前綴:ROLE_HEAD_OF_ENGINEERING?和?ROLE_HEAD_OF_MARKETING。
    • AuthenticatedVoter?只有在?objectDefinitionSource?對象中找到具有某個預定義角色的行時才進行投票。在?清單 9?中,有這樣一行:IS_AUTHENTICATED_ANONYMOUSLY。匿名身份驗證意味著用戶不能夠進行身份驗證。找到該行后,AuthenticatedVoter?將檢查一個匿名身份驗證的用戶是否可以訪問某些不受保護的資源(即這些資源沒有包含在具備?ROLE_?前綴的行中)。如果?AuthenticatedVoter?發現所請求的資源是不受保護的并且?objectDefinitionSource?對象允許匿名身份驗證的用戶訪問不受保護的資源,它將投票給允許訪問;否則就投票給拒絕訪問。

    示例應用程序

    本文提供了一個示例應用程序,它將演示您目前掌握的 LDAP 和 Acegi 概念。LDAP-Acegi 應用程序將顯示一個索引頁面,該頁面將設計和銷售文檔呈現給合適的經過身份驗證的用戶。正如您將看到的一樣,LDAP-Acegi 應用程序允許用戶?alice?查看設計文檔,并允許用戶?bob?查看銷售文檔。它還允許特定用戶同時查看設計和銷售文檔。所有這些內容都是在本文開頭配置 LDAP 目錄服務器時設置的。立即?下載示例應用程序來開始使用它。

    結束語

    在本文中,您了解了如何將用戶和業務角色信息托管在 LDAP 目錄中。您還詳細了解了配置 Acegi 的方法,從而與 LDAP 目錄交互實現訪問控制策略。在本系列最后一期文章中,我將展示如何配置 Acegi 來保護對 Java 類的訪問。

    第 3 部分: 實現對 Java 對象的訪問控制

    這期共分三部分的系列文章介紹了如何使用 Acegi 安全系統保護 Java 企業應用程序。系列文章的?第 1 部分?簡單介紹了 Acegi 并解釋如何使用其內置的安全過濾器實現一個簡單的、基于 URL 的安全系統。第 2 部分?介紹了如何編寫訪問控制策略并將其保存到一個 LDAP 目錄服務器,以及如何配置 Acegi 來與目錄服務器進行交互,從而實現訪問控制策略。第 3 部分(也是本系列的最后一篇文章)將演示如何在企業應用程序中使用 Acegi 保護對 Java 類實例的訪問。

    首先我將介紹何時需要對 Java 類訪問進行保護,包括文中引用的兩個典型企業應用程序場景。之后,我將解釋 Spring 的反轉控制(IOC)框架如何創建可從 JSP 或 servlet 訪問的 Java 類實例。我還將介紹有關?bean 代理?的重要概念,Spring 正是使用它過濾對 Java 類的訪問。最后,我將介紹如何對 Acegi 的方法安全性攔截器進行配置以控制對 Java 類的訪問。我將對?第 2 部分?中的示例程序進行增強,為實現安全的 Java 對象提供支持,從而結束本系列的最后一篇文章。

    由于本文的討論構建在本系列前兩部分的內容之上,因此會經常引用到?第 1 部分?和?第 2 部分?中的討論和示例。因此,在繼續閱讀本文之前,在其他瀏覽器窗口中打開前兩期文章將有助于理解本文內容。

    保護 Java 類的用例

    您可能還記得,我曾在本系列的開頭部分簡單介紹了?企業應用程序安全性。在那次討論中我曾提到過一種場景,其中 URL 安全性并不能完全滿足這種場景的安全需求:

    假設有這樣一個 PDF 文檔,其中包含了某制造業公司生產的特定產品的數據。文檔的一部分包含了設計數據,將由公司設計部分進行編輯和更新。文檔另一部分包含生產經理將使用到的生產數據。對于此類場景,需要實現更加細粒度的安全性,對文檔的不同部分應用不同的訪問權限。

    在繼續閱讀之前,請考慮更多的應用程序場景,除了實現 URL 安全性以外,這些場景還要求您對單獨的類訪問進行保護。

    業務自動化

    業務自動化應用程序中的工作流由多個流程組成。例如,病理學實驗室中執行血液測試的工作流由若干個步驟組成,其中每個步驟可看作一個業務流程:

  • 工作人員從病人處采集血液樣本并為其分配一個 ID。
  • 實驗室技術人員對樣本進行必要的測試并準備測試結果。
  • 由具備相應資格的病理學專家根據測試結果編寫測試報告。
  • 很明顯,每個流程分別由單獨的授權用戶執行。未授權的用戶則無權執行流程。例如,實驗室研究人員只負責準備試驗結果,而無權編寫測試報告。

    幾乎所有的業務自動化應用程序都普遍使用授權的業務流程。通常,每個業務流程被實現為一個 Java 類,并且需要使用合適的訪問控制策略對所有類實施保護。

    企業對企業(Business-to-business)集成

    Business-to-business (B2B) 集成指一種常見的場景,其中的兩個企業實體需要彼此公開各自的特定功能。例如,賓館可能向旅游公司公開其房間預訂功能,而后者使用該功能為游客預訂空閑的房間。作為合作伙伴的旅游公司可能具有一個特定的訂房率。在這個場景中,賓館的訂房系統必須先對旅游公司進行身份驗證,然后才能允許他們訪問所選擇的類,以便按照特定的訂房率進行房間預訂。

    使用 Spring 創建 Java 對象

    現在您已經了解了對 Java 類示例的訪問進行保護的重要性。在介紹能夠實現更高級安全性的 Acegi 新功能之前,我將引導您回顧 Spring 框架的幾個關鍵特性,您需要了解這些內容才能繼續后文的示例。

    首先對一些 Java 類進行配置并執行實例化。第 1 部分?曾介紹過,Java 類在 Spring 的 XML 配置文件中進行配置。在 Spring 配置文件中配置 Java 類的過程與 Acegi 過濾器的配置過程完全相同,因此這里不多做介紹。相反,我們將查看清單 1,它展示了名為?publicCatalog?的 bean 的配置:

    清單 1. Acegi XML 配置文件
    <beans><bean id="publicCatalog" class="com.catalog.PublicCatalog" /><!--Other bean tags --> <beans>

    了解 Spring 的 IOC 框架如何從 XML 配置文件讀取 Java 類信息以及如何進行實例化,這一點非常重要。您可能還記得,我在系列文章的?第 1 部分?中使用一個 web.xml 文件配置?<listener>?標記,它指向名為?ContextLoaderListener?的類。ContextLoaderListener?裝載 Spring 的 IOC 框架并創建 Java 對象。您可以參考?第 1 部分的清單 8?查看全部內容。圖 1 也對此進行了描述:

    圖 1. 裝載 Spring 的 IOC 框架并創建 Java 對象

    現在我們將詳細討論這些步驟:

  • 當初始化 Acegi 應用程序時,servlet 容器(本例中為 Apache Tomcat)創建了一個?servlet 上下文,其中保存了有關應用程序資源的信息,例如 JSP 頁面和類。
  • servlet 容器通知?ContextLoaderListener?類應用程序正在啟動。
  • ContextLoaderListener?類創建一個 Web 應用程序上下文以保存應用程序中特定于 Spring 的資源信息。借助 Spring 的 IOC 框架,您可以裝載自己的自定義應用程序上下文。要創建應用程序上下文,將使用名為?ContextLoader?的上下文裝載器類裝載應用程序上下文。
  • 如果應用程序不需要定義自己的應用程序上下文,則可以使用名為?XMLWebApplicationContext?的類,它是 Spring 框架的一部分并提供可處理 Spring XML 配置文件的功能。Acegi 應用程序使用的是 Spring 的 XML 配置文件,因此本文僅討論由?XMLWebApplicationContext?類表示的應用程序上下文。在本例中,上下文裝載器對?XMLWebApplicationContext?類進行實例化,后者表示您的 Acegi 應用程序的應用程序上下文。上下文裝載器還在 Web 應用程序上下文中設置 servlet 上下文(于步驟 1 中創建)的引用。
  • XMLWebApplicationContext?類對 XML 配置文件進行解析,獲得關于 Java 類的信息并將信息裝載到其他內部對象中。
  • XMLWebApplicationContext?類對 XML 配置文件中指定的所有 Java 類進行實例化。XMLWebApplicationContext?類檢查 XML 配置文件中經過配置的 Java bean 是否依賴其他的 Java 對象。如果是的話,XMLWebApplicationContext?類將首先對其他 bean 所依賴的 bean 進行實例化。通過這種方式,XMLWebApplicationContext?類創建了 XML 配置文件中定義的所有 bean 的實例。(注意,步驟 6 假定 XML 配置文件中所有 bean 都不要進行保護,稍后一節將介紹步驟 5 和步驟 6 之間執行的額外步驟,從而保護對此處創建的 Java bean 的訪問)。
  • XMLWebApplicationContext?類將所有 bean 保存在一個數組中。
  • 您現在已了解到如何從 XML 配置文件中裝載 bean 定義并創建 Java 類的實例。接下來,我將向您介紹 Spring bean 代理并解釋它對于保護 Java 類實例的重要性。

    使用 bean 代理

    上一節討論了 Spring 的 IOC 框架對 Java 對象進行實例化。要保護對 Java 對象的訪問,Spring 的 IOC 框架使用了?bean 代理?的概念。本節首先介紹如何配置 bean 代理,然后演示 Spring 的 IOC 框架如何創建代理對象。

    為 Java 對象配置代理

    如果希望創建 bean 代理,Spring IOC 框架要求您對代理創建器 bean 的實例進行配置。Spring 的 IOC 框架使用代理創建器創建代理對象。清單 2 為代理創建器 bean 的配置文件,用于保護名為?privateCatalog?的 Java 對象:

    清單 2. 代理 bean 配置
    <bean id="proxyCreator"class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"><property name="beanNames"><list><value>privateCatalog</value><!--Names of other beans to be proxied --></list></property><property name="interceptorNames"><list><value>privateCatalogSecurityInterceptor</value></list></property> </bean>

    如清單 2 所示,<bean>?標記具有一個?class?屬性,其值為?org.springframework.aop.framework.autoproxy. BeanNameAutoProxyCreator。BeanNameAutoProxyCreator?類是 Spring IOC 框架的一部分,可以自動創建 bean 代理。Spring 框架提供了BeanPostProcessor?接口,它提供了一種可擴展機制,允許應用程序編寫自己的邏輯來創建 bean 代理。Spring 的BeanNameAutoProxyCreator?類實現了?BeanPostProcessor?接口并提供所有必需的代理創建邏輯來保護 Java 類。因此,本文中您無需實現BeanPostProcessor?接口。

    在創建 bean 代理時,BeanNameAutoProxyCreator?類為所有由?beanNames?屬性定義的 bean 創建代理(參見?清單 2?中?<bean>?標記的第一個<property>?子元素)。beanNames?屬性在?<list>?標記中包含一個 bean 名稱列表。在?清單 2?中,我只對希望為之創建代理的privateCatalog?bean進行了配置。

    現在查看?清單 2?中?<bean>?標記的第二個?<property>?子元素。它指定了名為?interceptorNames?的代理,它將一個或多個攔截器的名稱封裝起來。我將在后文詳細討論攔截器概念。現在,只需了解攔截器可以攔截用戶并在用戶訪問 bean 之前實現訪問控制策略。

    現在,您已了解了如何對希望進行保護的 bean 配置代理。接下來,您將了解 Spring 的 IOC 框架如何在內部為應用程序的 bean 創建代理對象。

    Spring IOC 發揮效用

    在 “使用 Spring 創建 Java 對象” 的步驟 5 和步驟 6 中,您了解了?XMLWebApplicationContext?類如何從 XML 配置文件中讀取 bean 定義并隨后創建 bean 實例。在創建 bean 實例之前,XMLWebApplicationContext?類將檢查 XML 配置文件是否包含任何代理創建器 bean(即實現BeanPostProcessor?接口的 bean)配置。如果存在該 bean,它將要求代理創建器為您希望進行保護的 bean 創建 bean 代理。

    現在考慮代理創建器如何在內部創建代理對象:

  • 代理創建器(即?BeanNameAutoProxyCreator?類)裝載?清單 2?中配置的?beanNames?屬性文件中指定的所有 bean 名稱。
  • 代理創建器使用 bean 名稱裝載各自的 Java 類,這些類使用了每個 bean 定義的?class?屬性。
  • 代理創建器創建?清單 2?所示的?interceptorNames?屬性中指定的攔截器的實例。
  • 最后,代理創建器創建一個?Cglib2AopProxy?類的實例,將所有 bean 名稱(步驟 2)和攔截器(步驟 3)傳遞到?Cglib2AopProxy類。Cglib2AopProxy?類是 Spring 框架的一部分并用于生成動態代理對象。在本例中,Cglib2AopProxy?類將創建安全 bean 訪問控制所需的代理對象。
  • Cglib2AopProxy?類實現了兩個名為?AOPProxy?和?MethodInterceptor?的接口。AOPProxy?接口由 Spring 框架提供,表示您希望進行代理的實際 bean,因此它與您的 bean 公開相同的方法。MethodInterceptor?接口也源于 AOP 框架,它包含的方法可以在用戶試圖訪問您已執行代理的 bean 時接受控制權。這意味著?MethodInterceptor?接口處理來自用戶的請求以訪問執行過代理的 bean。由于?Cglib2AopProxy?類同時實現了?AOPProxy?和?MethodInterceptor?接口,因此它提供了完整的功能,既可以提供經過代理的 bean,也可以處理用戶請求以訪問代理 bean(參見?參考資料小節?中有關 AOP 的討論文章的鏈接)。

    執行完前面的步驟后,您現在具有了所需的代理對象。因此?XMLWebApplicationContext?類將安全 bean 的代理(而不是實際的 bean)保存在 “使用 Spring 創建 Java 對象” 的步驟 7 中的同一個數組中。

    訪問執行過代理的 Java 對象

    在前面的幾節中,您了解了 Spring 如何創建公有 bean 和私有 bean。出于本文的目的,您可將公有 bean 視為使用代理保護的不安全的私有 bean。現在我們來看一下客戶機應用程序為訪問公有 bean 和私有 bean 而必須遵循的一系列步驟。

    清單 3 展示了?publicCatalog?和?privateCatalog?兩個 bean 的 XML 配置。publicCatalog?bean 意味著公共訪問,因此不需要使用 bean 代理。privateCatalog?bean 意味著只能由指定用戶訪問,因此必須加以保護。我在清單 3 中包含了?privateCatalog?bean 的 bean 代理配置:

    清單 3. publicCatalog 和 privateCatalog bean 的 XML 配置
    <beans><bean id="publicCatalog" class="sample.PublicCatalog"/><bean id="privateCatalog" class="sample.PrivateCatalog"/><!-- proxy configuration for privateCatalog bean --><bean id="proxyCreator"class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"><property name="beanNames"><list><value>privateCatalog</value><!--Names of other beans to be proxied --></list></property> <property name="interceptorNames"><list><value>privateCatalogSecurityInterceptor</value></list></property></bean> <beans>

    應用程序可以使用清單 4 中的代碼訪問清單 3 中配置的?publicCatalog?和?privateCatalog?Java bean。注意,清單 4 中顯示的 Java 代碼可位于 JSP 頁面或位于服務器端 Java 應用程序的 bean 中。

    清單 4. 訪問安全和不安全 Java bean 的客戶機應用程序代碼
    //Step 1: Fetching an instance of the application context XMLWebApplicationContext applicationCtx =WebApplicationContextUtils.getWebApplicationContext(this.getServletConfig().getServletContext());//Step 2: Fetching an insecure bean from the application context PublicCatalog publicCatalog = (PublicCatalog) applicationCtx.getBean("publicCatalog");//Step 3: Calling a method of the insecure bean String publicData = publicCatalog.getData();//Step 4: Fetching a secure bean from the application context PrivateCatalog privateCatalog = (PrivateCatalog) applicationCtx.getBean("privateCatalog");//Step 5: Calling a method of the secure bean String privateData = privateCatalog.getData();

    下面將進一步討論清單 4 中的步驟:

    • 步驟 1:取回一個應用程序上下文實例
      當應用程序希望訪問 XML 配置文件中配置的 Java bean 時,它必須取回您在 “使用 Spring 創建 Java 對象” 的步驟 4 中見到的XMLWebApplicationContext?對象。XMLWebApplicationContext?對象包含對 XML 配置文件配置的所有 Java beans 的引用。
    • 步驟 2:從應用程序上下文中取回不安全的 bean
      您現在具有一個對?XMLWebApplicationContext?對象的引用。XMLWebApplicationContext?類公開了一個?getBean()?方法,它包含 bean 的名稱并在數組中查找 “使用 Spring 創建 Java 對象” 步驟 7 中準備的 bean。在本例中,該 bean 為?publicCatalog(未執行過代理),因此XMLWebApplicationContext?將返回實際的 bean。
    • 步驟 3:調用不安全 bean 的方法
      現在您可以調用步驟 2 中獲得的?publicCatalog?bean 的任何方法。例如,清單 4 顯示的?getData()?方法調用的執行沒有應用任何訪問控制并向應用程序返回類別數據。
    • 步驟 4:從應用程序上下文取回安全 bean
      安全 bean 與不安全 bean 的取回方式類似,惟一區別是:當您通過調用?getBean()?方法嘗試取回安全 bean 時,您將獲得安全對象的代理而不是實際的對象。該代理就是我在 “Spring IOC 發揮效用” 步驟 4 中解釋的由 Spring 框架創建的同一個對象。
    • 步驟 5:調用安全 bean 的方法
      當調用安全 bean 的方法時,您在?步驟 4?中獲得的代理對象將一個方法調用請求分配給攔截器。攔截器將檢查試圖訪問方法的用戶是否具有相應的訪問權,從而處理方法調用請求。

    您現在應該對 Spring 框架如何創建 Java 對象以及客戶機應用程序如何與之交互有了清晰的了解。了解了這些內容后,就更加容易理解并利用 Acegi 的方法安全性攔截器,下一節將具體介紹該主題。

    配置 Acegi 的方法安全性攔截器

    只要應用程序試圖訪問由 Acegi 安全系統保護的 bean 方法,請求將被自動傳遞到 Acegi 的方法安全性攔截器。方法安全性攔截器的作用就是控制對安全 Java bean 的方法的訪問。攔截器使用 Acegi 的身份驗證和授權框架確認用戶是否具有權利調用安全 Java bean 的方法,然后相應地作出響應。

    清單 5 展示 Acegi 的方法安全性攔截器的示例配置:

    清單 5. Acegi 的方法安全性攔截器的示例配置
    <bean id="privateCatalogSecurityInterceptor"class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor"><property name="authenticationManager"><ref bean="authenticationManager"/> </property><property name="accessDecisionManager"><ref bean="accessDecisionManager"/></property><property name="objectDefinitionSource"><value>sample.PrivateCatalog.getData=ROLE_HEAD_OF_ENGINEERING<!-- Roles required by other beans --></value></property> </bean>

    清單 5 所示的攔截器配置包含三個需要進行配置的屬性,可以保護對 Java bean 的訪問:authenticationManager、accessDecisionManager和?objectDefinitionSource。

    回憶一下,您在本系列第 1 部分的?配置身份驗證處理過濾器?中曾對?authenticationManager?屬性進行了配置。authenticationManager?屬性的作用是對用戶進行身份驗證。

    您在本系列的第二篇文章中了解了?accessDecisionManager?屬性。這個訪問決策管理器負責制定授權決策。在允許對一個安全 bean 進行訪問之前,方法安全攔截器使用?authenticationManager?和?accessDecisionManager?屬性對用戶進行身份驗證和授權。

    現在查看?清單 5?中配置的?objectDefinitionSource?屬性。它類似于第 1 部分中出現的?objectDefinitionSource?屬性。以前的objectDefinitionSource?包含類似于?/protected/*?和?/**?這樣的 URL,清單 5 中的?objectDefinitionSource?屬性指定類和方法名;例如,sample.PrivateCatalog?是之前執行過代理的類的名稱,而?getData?是您希望對其控制用戶訪問的方法的名字。

    當用戶訪問?PrivateCatalog?bean 的?getData()?方法時,控制權將自動傳遞給攔截器。攔截器使用 Acegi 框架檢查用戶的業務角色是否為ROLE_HEAD_OF_ENGINEERING(特定于本文的示例)。如果是的話,攔截器將允許對?getData()?方法進行訪問。如果攔截器發現用戶角色不是ROLE_HEAD_OF_ENGINEERING,則拒絕訪問。

    下一節將查看一個示例 Acegi 應用程序,它將實現您目前所了解的所有概念。

    示例 Acegi 應用程序

    本文的?下載源代碼?包含了一個名為 AcegiMethodSecurity 的示例應用程序,可按照以下方法進行配置和部署:

  • 使用用戶信息填充 LDAP 服務器。下載的示例應用程序?包含一個 LDIF 文件,其中含有預備裝載到 LDAP 服務器的用戶信息。關于如何將 LDIF 文件導入到 LDAP 服務器,請參考第 2 部分的 “填充服務器” 一節。注意,該應用程序涉及與第 2 部分相同的用戶(alice、bob?和specialUser)。
  • 將本文下載源代碼中的 acegiMethodSecurity.war 文件復制到 Tomcat 安裝目錄中的 webapps 目錄。
  • 將 Acegi 的 jar 文件復制到示例應用程序的 WEB-INF/lib 文件夾。(有關內容請參考第 1 部分的 “部署和運行應用程序” 一節。 )
  • 下載 cglib-full-2.0.2.jar 文件并將其復制到示例應用程序的 WEB-INF/lib 文件夾。
  • 啟動 Tomcat 并嘗試運行示例應用程序。

    運行示例應用程序

    通過從瀏覽器訪問 http://localhost:8080/acegiMethodSecurity URL 可調用示例應用程序。AcegiMethodSecurity 顯示的索引頁面包含兩個鏈接(Catalog?和?Login),如圖 2 所示:

    圖 2. 示例應用程序的主頁面

    當單擊應用程序的?Catalog?鏈接時,它將要求您進行登錄。如果以?alice?或?specialUser?的身份進行登錄,示例應用程序將提供完整的?類別,包括公有數據和私有數據。這是因為在?清單 5?中,您對方法安全性攔截器進行了配置,允許用戶使用?ROLE_HEAD_OF_ENGINEERING?訪問私有類別,而?alice?和?specialUser?都具有該訪問權。另一方面,如果您以?bob?的身份登錄,示例應用程序將僅顯示公有數據。

    為通過身份驗證的用戶分配額外角色

    本節將演示經過增強的示例應用程序。增強后的示例應用程序將展示 Acegi 如何使您能夠在運行時向通過身份驗證的用戶臨時分配額外角色。

    當安全 bean(例如?清單 3?的?privateCatalog?bean)要訪問一個原創資源時,您可能需要使用額外的角色。例如,您可能考慮到您的安全 bean 需要通過 Java 的 Remote Method Invocation (RMI) 框架或一個 Web 服務訪問某個遠程應用程序。訪問安全 bean 的用戶不會占用遠程應用程序要求訪問用戶所具備的業務角色。

    在本例中,Acegi 首先檢查用戶是否經過授權來訪問安全 bean。之后,Acegi 允許用戶訪問安全 bean。當安全 bean 試圖訪問遠程服務時,它需要使用額外的業務角色。如果訪問安全 bean 的用戶不具備額外角色,安全 bean 就不能成功訪問遠程服務。

    run-as-replacement 機制

    Acegi 框架提供了一種名為?run-as-replacement?的簡單機制,允許您僅在方法調用期間為通過身份驗證的用戶配置一個或多個額外角色。您可以使用 run-as-replacement 機制為訪問遠程應用程序的安全 bean 配置額外角色。這意味著只要安全 bean 需要訪問遠程應用程序,Acegi 將為用戶裝載額外角色,從而允許安全 bean 訪問遠程應用程序。

    清單 6 對?清單 5?中的方法安全性攔截器的配置進行了增強。增強后的配置使用了 run-as-replacement 機制。

    清單 6. Acegi 方法安全性攔截器的增強配置

    點擊查看代碼清單

    清單 6 使用粗體顯示了兩處增強(與?清單 5?相比)。第一處增強為?runAsManager?屬性。runAsManager?屬性的作用是向通過身份驗證的用戶動態添加角色。出于這個目的,runAsManager?屬性包含了?RunAsManagerImpl?bean 的定義。RunAsManagerImpl?bean 只有在滿足下面的條件時才可變為活躍狀態:在?objectDefinitionSource?方法的角色定義中找到以?RUN_AS_?為前綴的角色。例如,PrivateCatalog.getData()?方法的角色定義(清單 6?中以粗體顯示的第二處增強)具有一個?RUN_AS_MANAGER?角色。

    RunAsManagerImpl?bean 包含一個名為?key?的屬性,它封裝的加密鍵用于確保只將額外的角色作為 run-as-replacement 程序的一部分生成。

    當用戶調用?getData()?方法時,RunAsManagerImpl?bean 變為活躍狀態并創建名為?RUN_AS_MANAGER?的額外角色,從而啟用?getData()?方法訪問遠程應用程序。

    增強的方法安全性

    本文的?下載源代碼?包含一個名為?EnhancedAcegiMethodSecurity?的示例應用程序,它可以演示 run-as-replacement 機制和程序。該應用程序將顯示一個具有 Catalog 鏈接的索引頁面。如果單擊?Catalog?鏈接,將要求進行登錄。

    登錄后,EnhancedAcegiMethodSecurity?應用程序將為您提供登錄用戶及其角色的完整信息。例如,如果以?alice?或?specialUser?身份登錄,將向您顯示用戶的所有業務角色,包括額外創建的臨時的?RUN_AS_MANAGER?角色。

    結束語

    在這份共分三部分的系列文章中,我介紹了如何使用 Acegi 安全系統增強基于 URL 的安全性和基于方法的安全性。您了解了如何設計訪問控制策略并將它們托管在目錄服務器中,如何對 Acegi 進行配置以與目錄服務器進行通信,以及如何根據托管在服務器的訪問控制策略制定身份驗證和授權決策。

    本系列的最后一篇文章主要介紹使用基于方法的安全性保護 Java 類實例。文章還解釋了 Acegi 和 Spring 如何在內部創建和代理 Java 對象以及 bean 代理如何實現訪問控制。文章包含了兩個示例應用程序,您可以使用它們進一步研究本系列中學到的概念,更多有關使用 Acegi 保護 Java 應用程序的內容,請參見?參考資料?小節。

    ?

    原文來自:

    http://www.ibm.com/developerworks/cn/java/j-acegi1/index.html

    http://www.ibm.com/developerworks/cn/java/j-acegi2/

    http://www.ibm.com/developerworks/cn/java/j-acegi3/

    ?

    轉載于:https://www.cnblogs.com/davidwang456/p/3818846.html

    總結

    以上是生活随笔為你收集整理的使用 Acegi 保护 Java 应用程序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    成人免费视频视频在线观看 免费 | 国产色精品久久人妻 | 无码午夜成人1000部免费视频 | 99久久婷婷国产综合精品青草免费 | 波多野结衣一区二区三区av免费 | 1000部夫妻午夜免费 | 帮老师解开蕾丝奶罩吸乳网站 | 欧美性黑人极品hd | 国产人妻人伦精品 | 99精品久久毛片a片 | 中文字幕av日韩精品一区二区 | 丰满人妻一区二区三区免费视频 | 国产人妖乱国产精品人妖 | 精品国偷自产在线 | 三级4级全黄60分钟 | 国产乱人伦av在线无码 | 国产精品久久久av久久久 | 亚洲国产精品久久久久久 | 久久久精品人妻久久影视 | 麻豆精品国产精华精华液好用吗 | 国产午夜手机精彩视频 | 97人妻精品一区二区三区 | 久久综合网欧美色妞网 | 在线成人www免费观看视频 | 久久久久亚洲精品中文字幕 | 无码人妻丰满熟妇区五十路百度 | 女高中生第一次破苞av | 荡女精品导航 | 亚洲色欲色欲欲www在线 | 国产乱码精品一品二品 | 亚洲欧美日韩成人高清在线一区 | 人妻天天爽夜夜爽一区二区 | 3d动漫精品啪啪一区二区中 | 美女极度色诱视频国产 | 久久精品中文闷骚内射 | 亚洲成av人综合在线观看 | 中文字幕乱码人妻二区三区 | 人人澡人人透人人爽 | 一个人看的视频www在线 | 最近免费中文字幕中文高清百度 | 国产精品第一国产精品 | 精品亚洲成av人在线观看 | 亚洲精品午夜国产va久久成人 | 少妇太爽了在线观看 | 人人爽人人澡人人人妻 | 国产熟妇高潮叫床视频播放 | 乱中年女人伦av三区 | 国产真人无遮挡作爱免费视频 | 亚洲精品一区二区三区大桥未久 | 国产在线精品一区二区三区直播 | 无码精品国产va在线观看dvd | 色综合天天综合狠狠爱 | 欧美 丝袜 自拍 制服 另类 | 亚洲精品综合一区二区三区在线 | 2020久久香蕉国产线看观看 | 色爱情人网站 | 丁香花在线影院观看在线播放 | 日日鲁鲁鲁夜夜爽爽狠狠 | 我要看www免费看插插视频 | 无码精品国产va在线观看dvd | 女人被爽到呻吟gif动态图视看 | 大地资源中文第3页 | 精品无码一区二区三区的天堂 | 成熟人妻av无码专区 | aa片在线观看视频在线播放 | 日韩无套无码精品 | 性欧美videos高清精品 | 任你躁国产自任一区二区三区 | 久久久亚洲欧洲日产国码αv | 曰韩无码二三区中文字幕 | 婷婷五月综合缴情在线视频 | 伊人久久大香线蕉亚洲 | 欧美日韩视频无码一区二区三 | 欧美熟妇另类久久久久久不卡 | 免费乱码人妻系列无码专区 | 欧美性黑人极品hd | 97色伦图片97综合影院 | 日本又色又爽又黄的a片18禁 | 亚洲一区二区三区国产精华液 | 色窝窝无码一区二区三区色欲 | 日本精品少妇一区二区三区 | 一本色道久久综合狠狠躁 | 国产精品久久久久无码av色戒 | 久久99精品久久久久久 | 日本熟妇乱子伦xxxx | 色综合视频一区二区三区 | 免费中文字幕日韩欧美 | 青青草原综合久久大伊人精品 | 国内少妇偷人精品视频免费 | 欧美老妇交乱视频在线观看 | 欧美35页视频在线观看 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 色欲久久久天天天综合网精品 | 青青青爽视频在线观看 | 久久久久99精品成人片 | 成人毛片一区二区 | 亚洲精品一区二区三区婷婷月 | 精品国产一区二区三区四区 | 精品日本一区二区三区在线观看 | 精品欧洲av无码一区二区三区 | 捆绑白丝粉色jk震动捧喷白浆 | 黑人玩弄人妻中文在线 | 午夜理论片yy44880影院 | 欧美国产亚洲日韩在线二区 | 国产精品久久久av久久久 | 免费人成网站视频在线观看 | 久久国产精品精品国产色婷婷 | 成人无码视频在线观看网站 | 精品无码成人片一区二区98 | 亚洲a无码综合a国产av中文 | 两性色午夜视频免费播放 | 爽爽影院免费观看 | 少妇高潮喷潮久久久影院 | 日韩欧美中文字幕在线三区 | 日本精品人妻无码免费大全 | 免费看少妇作爱视频 | 99riav国产精品视频 | 欧美性猛交xxxx富婆 | 亚洲综合色区中文字幕 | 久久99精品国产.久久久久 | 狠狠色丁香久久婷婷综合五月 | 成人片黄网站色大片免费观看 | 国产莉萝无码av在线播放 | 青草青草久热国产精品 | 国产熟妇另类久久久久 | 1000部啪啪未满十八勿入下载 | 97人妻精品一区二区三区 | 亚洲人成网站色7799 | 老头边吃奶边弄进去呻吟 | 国产精品二区一区二区aⅴ污介绍 | 成人免费视频视频在线观看 免费 | 无码人妻精品一区二区三区不卡 | 丰满人妻精品国产99aⅴ | 最近免费中文字幕中文高清百度 | 无码精品人妻一区二区三区av | 狠狠cao日日穞夜夜穞av | 国产一区二区三区影院 | 欧美人与动性行为视频 | 婷婷综合久久中文字幕蜜桃三电影 | 无码人妻精品一区二区三区不卡 | 国产特级毛片aaaaaa高潮流水 | 999久久久国产精品消防器材 | 中文字幕无码av激情不卡 | 麻豆av传媒蜜桃天美传媒 | 亚洲综合精品香蕉久久网 | 内射后入在线观看一区 | 奇米影视888欧美在线观看 | 久久久久久av无码免费看大片 | 精品国产青草久久久久福利 | 奇米影视888欧美在线观看 | 67194成是人免费无码 | 国产日产欧产精品精品app | 老司机亚洲精品影院 | 1000部啪啪未满十八勿入下载 | 娇妻被黑人粗大高潮白浆 | 精品 日韩 国产 欧美 视频 | 国产av一区二区三区最新精品 | 国产又爽又黄又刺激的视频 | 亚洲va欧美va天堂v国产综合 | 中文字幕乱码人妻无码久久 | 一区二区三区高清视频一 | 久久久精品成人免费观看 | 三上悠亚人妻中文字幕在线 | 无码纯肉视频在线观看 | 西西人体www44rt大胆高清 | 久久国产精品二国产精品 | 又粗又大又硬毛片免费看 | 中文字幕av日韩精品一区二区 | 亚洲国产午夜精品理论片 | 蜜桃臀无码内射一区二区三区 | 亚洲一区二区三区无码久久 | 国产黑色丝袜在线播放 | 美女黄网站人色视频免费国产 | 国产热a欧美热a在线视频 | 东京热一精品无码av | 久久久久久国产精品无码下载 | 亚洲精品一区二区三区在线 | 国产又爽又黄又刺激的视频 | 5858s亚洲色大成网站www | 中文字幕av日韩精品一区二区 | 国产小呦泬泬99精品 | 国内精品人妻无码久久久影院 | 日日碰狠狠丁香久燥 | 国产成人精品无码播放 | 丝袜足控一区二区三区 | 人妻与老人中文字幕 | 精品无码国产自产拍在线观看蜜 | 丝袜美腿亚洲一区二区 | 牲欲强的熟妇农村老妇女视频 | 日本一区二区更新不卡 | 综合人妻久久一区二区精品 | 丝袜美腿亚洲一区二区 | 欧美老熟妇乱xxxxx | 国产精品资源一区二区 | 亚洲一区二区观看播放 | 在线观看欧美一区二区三区 | 国产av剧情md精品麻豆 | 久久国产精品二国产精品 | 亚拍精品一区二区三区探花 | 麻豆国产人妻欲求不满谁演的 | 国产精品久久国产三级国 | 国产婷婷色一区二区三区在线 | 黄网在线观看免费网站 | 日本一本二本三区免费 | 日本熟妇人妻xxxxx人hd | 亚洲国产精品久久久天堂 | 对白脏话肉麻粗话av | 人人妻在人人 | 亚洲精品久久久久avwww潮水 | 亚洲国产av精品一区二区蜜芽 | 亚洲国产精品毛片av不卡在线 | 国产在线精品一区二区高清不卡 | 成人aaa片一区国产精品 | 色综合久久久无码中文字幕 | 国精产品一品二品国精品69xx | 日韩少妇内射免费播放 | 日韩欧美群交p片內射中文 | 亚洲精品午夜国产va久久成人 | 国产熟妇另类久久久久 | 野外少妇愉情中文字幕 | 奇米影视7777久久精品人人爽 | 久久久久国色av免费观看性色 | 国内综合精品午夜久久资源 | 在线亚洲高清揄拍自拍一品区 | 人人妻人人藻人人爽欧美一区 | 国产精品人人爽人人做我的可爱 | 国产成人精品视频ⅴa片软件竹菊 | 18禁黄网站男男禁片免费观看 | 免费无码av一区二区 | 亚洲精品一区二区三区四区五区 | 精品国产一区av天美传媒 | 亚洲a无码综合a国产av中文 | 久久久精品456亚洲影院 | 1000部夫妻午夜免费 | 欧美老妇与禽交 | 久久久久久亚洲精品a片成人 | 超碰97人人射妻 | 久久精品国产大片免费观看 | 天堂在线观看www | 人妻天天爽夜夜爽一区二区 | 欧美国产日韩亚洲中文 | 性欧美熟妇videofreesex | 亚洲人成网站免费播放 | 免费看少妇作爱视频 | 日日摸日日碰夜夜爽av | 亚洲欧美综合区丁香五月小说 | 国产精品成人av在线观看 | 性色av无码免费一区二区三区 | 丰腴饱满的极品熟妇 | 2020久久香蕉国产线看观看 | 亚洲 a v无 码免 费 成 人 a v | 亚洲一区二区三区四区 | 日韩精品无码一本二本三本色 | 妺妺窝人体色www婷婷 | 亚洲国产精品无码一区二区三区 | 无码一区二区三区在线观看 | 性啪啪chinese东北女人 | 日本精品人妻无码77777 天堂一区人妻无码 | 无码午夜成人1000部免费视频 | 激情内射日本一区二区三区 | 夜夜高潮次次欢爽av女 | 少妇性荡欲午夜性开放视频剧场 | 亚洲精品一区二区三区大桥未久 | 日韩成人一区二区三区在线观看 | 国产真人无遮挡作爱免费视频 | 超碰97人人做人人爱少妇 | 色 综合 欧美 亚洲 国产 | 夜精品a片一区二区三区无码白浆 | 久久伊人色av天堂九九小黄鸭 | 欧美日韩一区二区免费视频 | 久久精品无码一区二区三区 | 丰满少妇人妻久久久久久 | 日韩人妻少妇一区二区三区 | 国产人妻久久精品二区三区老狼 | 无码一区二区三区在线观看 | www国产亚洲精品久久久日本 | 一本无码人妻在中文字幕免费 | 男女作爱免费网站 | 久激情内射婷内射蜜桃人妖 | 日本www一道久久久免费榴莲 | 国产精品亚洲综合色区韩国 | 国产成人无码av片在线观看不卡 | 无码国产色欲xxxxx视频 | 人妻互换免费中文字幕 | 久久亚洲中文字幕精品一区 | 1000部啪啪未满十八勿入下载 | 亚洲gv猛男gv无码男同 | 无码人妻久久一区二区三区不卡 | 中文字幕av日韩精品一区二区 | 欧美日韩久久久精品a片 | 久久综合色之久久综合 | 中国大陆精品视频xxxx | 强辱丰满人妻hd中文字幕 | 小sao货水好多真紧h无码视频 | 日韩欧美中文字幕在线三区 | 亚洲日韩精品欧美一区二区 | 日韩精品成人一区二区三区 | 国产疯狂伦交大片 | 欧美人与动性行为视频 | 宝宝好涨水快流出来免费视频 | 久在线观看福利视频 | 性生交大片免费看女人按摩摩 | 久久精品中文字幕大胸 | 精品水蜜桃久久久久久久 | 妺妺窝人体色www婷婷 | 亚洲色欲色欲天天天www | 激情内射亚州一区二区三区爱妻 | 一个人看的www免费视频在线观看 | 国产精品久久久久久亚洲毛片 | 国产精品亚洲专区无码不卡 | 精品久久久无码人妻字幂 | 久久久精品欧美一区二区免费 | 青青久在线视频免费观看 | 国产免费久久精品国产传媒 | 东京无码熟妇人妻av在线网址 | 亚洲色欲久久久综合网东京热 | 扒开双腿疯狂进出爽爽爽视频 | 女人色极品影院 | 一本大道伊人av久久综合 | 人妻熟女一区 | 在线天堂新版最新版在线8 | av人摸人人人澡人人超碰下载 | 色综合久久中文娱乐网 | 性色av无码免费一区二区三区 | 日韩精品a片一区二区三区妖精 | 中文字幕无码热在线视频 | 国产精品美女久久久网av | 国产美女极度色诱视频www | 麻豆精品国产精华精华液好用吗 | 大肉大捧一进一出好爽视频 | 久久久精品456亚洲影院 | 亚洲熟熟妇xxxx | 欧美人与牲动交xxxx | 人妻少妇精品久久 | 国产超碰人人爽人人做人人添 | 激情内射日本一区二区三区 | 亚洲国产精品久久久久久 | 日韩精品一区二区av在线 | 亚洲爆乳大丰满无码专区 | 成人欧美一区二区三区黑人 | 国产三级久久久精品麻豆三级 | 老司机亚洲精品影院 | 正在播放老肥熟妇露脸 | 老司机亚洲精品影院 | 女人色极品影院 | 又大又紧又粉嫩18p少妇 | 极品嫩模高潮叫床 | 亚洲日韩一区二区三区 | 成人亚洲精品久久久久 | 亚洲精品一区二区三区四区五区 | 最新国产麻豆aⅴ精品无码 | 亚洲精品久久久久久一区二区 | 高清无码午夜福利视频 | 国产成人精品优优av | 77777熟女视频在线观看 а天堂中文在线官网 | 人妻少妇被猛烈进入中文字幕 | 久久人人爽人人人人片 | 国产成人精品三级麻豆 | 国产精品内射视频免费 | a片在线免费观看 | 亚洲区小说区激情区图片区 | 国产电影无码午夜在线播放 | 国产精品毛片一区二区 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久午夜无码鲁丝片 | 亚洲精品综合五月久久小说 | 性欧美牲交在线视频 | 国产精品怡红院永久免费 | 国产av一区二区精品久久凹凸 | 欧美人与禽猛交狂配 | 日本熟妇乱子伦xxxx | 欧美大屁股xxxxhd黑色 | 久久久久免费看成人影片 | 中文字幕乱码人妻无码久久 | 鲁鲁鲁爽爽爽在线视频观看 | 国产在线精品一区二区三区直播 | 天天摸天天碰天天添 | 丁香花在线影院观看在线播放 | 日日鲁鲁鲁夜夜爽爽狠狠 | 欧美一区二区三区视频在线观看 | 成在人线av无码免费 | 婷婷五月综合激情中文字幕 | 日本熟妇人妻xxxxx人hd | 日韩欧美成人免费观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 亚洲gv猛男gv无码男同 | 成 人 网 站国产免费观看 | 蜜桃av抽搐高潮一区二区 | 久久综合给久久狠狠97色 | 国产热a欧美热a在线视频 | 天天摸天天透天天添 | 国产综合在线观看 | 人人澡人摸人人添 | 在线观看免费人成视频 | 成年美女黄网站色大免费全看 | 亚洲自偷自拍另类第1页 | 久久亚洲国产成人精品性色 | 久久这里只有精品视频9 | 国产小呦泬泬99精品 | 国产人妻精品一区二区三区 | 亚洲色无码一区二区三区 | 久久精品中文字幕一区 | 精品日本一区二区三区在线观看 | 国产激情无码一区二区app | 国产精品无码久久av | 女人被男人爽到呻吟的视频 | 国产婷婷色一区二区三区在线 | 欧美xxxx黑人又粗又长 | 性生交大片免费看l | 色一情一乱一伦一区二区三欧美 | 成人无码视频免费播放 | 无码精品人妻一区二区三区av | 成人免费无码大片a毛片 | 无遮无挡爽爽免费视频 | 高潮喷水的毛片 | 亚洲综合另类小说色区 | 国产无套粉嫩白浆在线 | 欧美成人午夜精品久久久 | 在线观看欧美一区二区三区 | 强辱丰满人妻hd中文字幕 | 狠狠亚洲超碰狼人久久 | √8天堂资源地址中文在线 | 欧美丰满老熟妇xxxxx性 | 人人妻人人澡人人爽精品欧美 | 精品午夜福利在线观看 | 特黄特色大片免费播放器图片 | 国产精品办公室沙发 | 99riav国产精品视频 | 成人aaa片一区国产精品 | 风流少妇按摩来高潮 | 伊人久久大香线蕉午夜 | 色婷婷av一区二区三区之红樱桃 | 久久久久成人精品免费播放动漫 | 欧美xxxx黑人又粗又长 | 亚洲一区二区三区含羞草 | 高中生自慰www网站 | 日本一区二区三区免费播放 | 97久久国产亚洲精品超碰热 | 377p欧洲日本亚洲大胆 | 国产农村乱对白刺激视频 | 欧美老人巨大xxxx做受 | 国产精品久久久av久久久 | 国产热a欧美热a在线视频 | 欧美色就是色 | 熟妇激情内射com | 欧美日本精品一区二区三区 | 亚洲 高清 成人 动漫 | 亚洲の无码国产の无码步美 | 国产无遮挡又黄又爽免费视频 | 中文字幕无码免费久久9一区9 | 国产精品久久久一区二区三区 | 久久人人爽人人人人片 | 精品无码国产一区二区三区av | 久久国语露脸国产精品电影 | 成人一区二区免费视频 | 亚洲の无码国产の无码影院 | 纯爱无遮挡h肉动漫在线播放 | 波多野结衣高清一区二区三区 | 亚洲色在线无码国产精品不卡 | √8天堂资源地址中文在线 | 少妇性俱乐部纵欲狂欢电影 | 日韩少妇白浆无码系列 | 亚洲国产精品久久久天堂 | 中文字幕久久久久人妻 | 沈阳熟女露脸对白视频 | 97久久国产亚洲精品超碰热 | 激情五月综合色婷婷一区二区 | 国产精品丝袜黑色高跟鞋 | 久久久国产精品无码免费专区 | 国产黄在线观看免费观看不卡 | 亚洲国产精华液网站w | 极品嫩模高潮叫床 | 一本久久伊人热热精品中文字幕 | 国产精品国产三级国产专播 | 国产莉萝无码av在线播放 | 两性色午夜视频免费播放 | 亚洲一区二区三区 | 国产精品人人爽人人做我的可爱 | 日韩人妻无码一区二区三区久久99 | 亚洲国产精品久久久天堂 | 久久久久成人精品免费播放动漫 | 国产精品亚洲а∨无码播放麻豆 | 乱码午夜-极国产极内射 | 免费无码午夜福利片69 | 国产成人亚洲综合无码 | 久久99久久99精品中文字幕 | √天堂中文官网8在线 | 东京热男人av天堂 | 中文字幕无码人妻少妇免费 | 激情亚洲一区国产精品 | 日日摸日日碰夜夜爽av | 欧美 丝袜 自拍 制服 另类 | 国产一区二区三区影院 | 欧洲极品少妇 | 国产精品亚洲综合色区韩国 | 天天躁夜夜躁狠狠是什么心态 | 人人妻人人澡人人爽欧美一区九九 | 色一情一乱一伦一区二区三欧美 | 国产精品高潮呻吟av久久 | 色妞www精品免费视频 | 国产香蕉尹人视频在线 | 人人澡人摸人人添 | 国产精品久久久 | 国产高清不卡无码视频 | 日本护士xxxxhd少妇 | 亚洲国产精品久久久天堂 | 99精品视频在线观看免费 | 女人被爽到呻吟gif动态图视看 | a在线观看免费网站大全 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | yw尤物av无码国产在线观看 | 人人妻人人澡人人爽精品欧美 | 人人妻人人澡人人爽欧美一区九九 | 成在人线av无码免观看麻豆 | 中文字幕乱码人妻无码久久 | 欧美黑人性暴力猛交喷水 | 51国偷自产一区二区三区 | 国产成人无码一二三区视频 | 亚洲日韩av片在线观看 | 亚洲国产一区二区三区在线观看 | 日韩欧美中文字幕在线三区 | 国产成人无码午夜视频在线观看 | 在线观看免费人成视频 | 九九综合va免费看 | 亚洲成av人片在线观看无码不卡 | аⅴ资源天堂资源库在线 | 亚洲娇小与黑人巨大交 | 亚洲男女内射在线播放 | 美女黄网站人色视频免费国产 | 无码人妻丰满熟妇区五十路百度 | 日韩精品无码一本二本三本色 | 欧美性黑人极品hd | 青草视频在线播放 | 亚洲国产精品一区二区第一页 | 国产亚洲精品久久久久久国模美 | 日本欧美一区二区三区乱码 | 亚洲s码欧洲m码国产av | 一本久久a久久精品亚洲 | 成熟人妻av无码专区 | 免费观看的无遮挡av | 初尝人妻少妇中文字幕 | 亚洲毛片av日韩av无码 | 免费网站看v片在线18禁无码 | 日本熟妇人妻xxxxx人hd | 欧美猛少妇色xxxxx | 色欲人妻aaaaaaa无码 | 18精品久久久无码午夜福利 | 中文字幕人成乱码熟女app | 久久精品国产99久久6动漫 | 国产后入清纯学生妹 | 久久久久成人片免费观看蜜芽 | 中文字幕精品av一区二区五区 | 欧美丰满熟妇xxxx | 亚洲国产日韩a在线播放 | 亚洲日本一区二区三区在线 | 97无码免费人妻超级碰碰夜夜 | 国产av一区二区三区最新精品 | 2020久久超碰国产精品最新 | 娇妻被黑人粗大高潮白浆 | 黑人巨大精品欧美一区二区 | 国产真人无遮挡作爱免费视频 | 午夜精品一区二区三区的区别 | 无码成人精品区在线观看 | 欧美精品一区二区精品久久 | 久久精品成人欧美大片 | 国产 浪潮av性色四虎 | 亚洲成色www久久网站 | 亚洲呦女专区 | 国内综合精品午夜久久资源 | 一本久久伊人热热精品中文字幕 | 思思久久99热只有频精品66 | 欧美性色19p | 成在人线av无码免费 | 一本久道久久综合狠狠爱 | 啦啦啦www在线观看免费视频 | 精品无人区无码乱码毛片国产 | 欧美高清在线精品一区 | 久久97精品久久久久久久不卡 | 伊在人天堂亚洲香蕉精品区 | 精品一区二区不卡无码av | 久久人人爽人人爽人人片av高清 | 国产高潮视频在线观看 | 国产办公室秘书无码精品99 | 午夜性刺激在线视频免费 | 精品国产成人一区二区三区 | 国模大胆一区二区三区 | 亚洲色成人中文字幕网站 | 亚洲七七久久桃花影院 | 日本一区二区三区免费高清 | 美女黄网站人色视频免费国产 | 欧美熟妇另类久久久久久不卡 | 国产农村乱对白刺激视频 | 两性色午夜视频免费播放 | 亚洲精品国产第一综合99久久 | 超碰97人人做人人爱少妇 | 欧美 丝袜 自拍 制服 另类 | av无码电影一区二区三区 | 免费观看又污又黄的网站 | 国产一区二区三区影院 | 波多野结衣 黑人 | 性欧美videos高清精品 | 欧美黑人乱大交 | 久久久久99精品成人片 | 小sao货水好多真紧h无码视频 | 九九热爱视频精品 | 国产精品无套呻吟在线 | 一个人看的视频www在线 | 国产免费久久久久久无码 | 国产成人无码专区 | 亚洲色偷偷男人的天堂 | 波多野结衣aⅴ在线 | 国产婷婷色一区二区三区在线 | 亚洲精品一区二区三区大桥未久 | 欧美激情一区二区三区成人 | 午夜精品久久久内射近拍高清 | 乱码午夜-极国产极内射 | 欧美xxxx黑人又粗又长 | 在线播放亚洲第一字幕 | 国产手机在线αⅴ片无码观看 | 奇米影视888欧美在线观看 | 国产精品无码一区二区桃花视频 | 无码国内精品人妻少妇 | 女高中生第一次破苞av | 免费观看的无遮挡av | 国产人妻精品一区二区三区不卡 | 久久午夜夜伦鲁鲁片无码免费 | 伊人久久大香线焦av综合影院 | 欧美激情综合亚洲一二区 | 亚洲综合久久一区二区 | 18禁止看的免费污网站 | 婷婷五月综合激情中文字幕 | 久久无码中文字幕免费影院蜜桃 | 国产精品-区区久久久狼 | 无遮挡啪啪摇乳动态图 | 无码一区二区三区在线 | 偷窥日本少妇撒尿chinese | 黑人巨大精品欧美一区二区 | 少女韩国电视剧在线观看完整 | 九九热爱视频精品 | 国产热a欧美热a在线视频 | 在线观看国产一区二区三区 | 天堂а√在线地址中文在线 | 草草网站影院白丝内射 | 蜜臀aⅴ国产精品久久久国产老师 | 在线精品亚洲一区二区 | 婷婷五月综合激情中文字幕 | 中文字幕+乱码+中文字幕一区 | 人人妻人人澡人人爽精品欧美 | 中文精品无码中文字幕无码专区 | 国产手机在线αⅴ片无码观看 | 四虎永久在线精品免费网址 | 人人澡人摸人人添 | 99视频精品全部免费免费观看 | 扒开双腿吃奶呻吟做受视频 | 99视频精品全部免费免费观看 | 亚洲国产av精品一区二区蜜芽 | 蜜臀av在线播放 久久综合激激的五月天 | 最新国产麻豆aⅴ精品无码 | 亚洲热妇无码av在线播放 | 久久亚洲中文字幕精品一区 | v一区无码内射国产 | 丰满诱人的人妻3 | 最新国产麻豆aⅴ精品无码 | 国内综合精品午夜久久资源 | 中文字幕无码免费久久9一区9 | 国产精品久久久一区二区三区 | 高清国产亚洲精品自在久久 | 精品久久久无码中文字幕 | 亚洲欧美国产精品专区久久 | 久久国内精品自在自线 | a片在线免费观看 | 99久久人妻精品免费一区 | 亚洲国产欧美国产综合一区 | 久久综合网欧美色妞网 | 亚洲の无码国产の无码影院 | 亚洲精品久久久久久久久久久 | 国产精品毛片一区二区 | 国产成人无码a区在线观看视频app | 亚洲一区二区三区 | 亚洲人成影院在线无码按摩店 | 亚洲综合在线一区二区三区 | 牲欲强的熟妇农村老妇女 | 日韩在线不卡免费视频一区 | 国产精品丝袜黑色高跟鞋 | 久久久久久久人妻无码中文字幕爆 | 77777熟女视频在线观看 а天堂中文在线官网 | 色爱情人网站 | 午夜福利不卡在线视频 | 免费国产成人高清在线观看网站 | 婷婷五月综合激情中文字幕 | 亚洲码国产精品高潮在线 | 狠狠综合久久久久综合网 | 无码av最新清无码专区吞精 | 99国产精品白浆在线观看免费 | 内射爽无广熟女亚洲 | aⅴ在线视频男人的天堂 | 中文精品无码中文字幕无码专区 | 无套内谢的新婚少妇国语播放 | 东北女人啪啪对白 | 色欲久久久天天天综合网精品 | 无码人妻精品一区二区三区下载 | 中文字幕无码免费久久9一区9 | 国内精品人妻无码久久久影院 | 国产另类ts人妖一区二区 | 中文久久乱码一区二区 | 国产精品无码成人午夜电影 | 在线看片无码永久免费视频 | 2019午夜福利不卡片在线 | 亚洲国产欧美国产综合一区 | 一本久久a久久精品亚洲 | 日本熟妇乱子伦xxxx | 国产精品亚洲一区二区三区喷水 | 国产精品沙发午睡系列 | www国产亚洲精品久久网站 | 一本大道久久东京热无码av | 一本色道久久综合亚洲精品不卡 | 2020久久香蕉国产线看观看 | 特黄特色大片免费播放器图片 | 国产精品久久久久7777 | 中文无码精品a∨在线观看不卡 | 欧美激情内射喷水高潮 | 人人澡人人妻人人爽人人蜜桃 | 色综合久久久无码网中文 | 麻豆md0077饥渴少妇 | 美女极度色诱视频国产 | 亚洲国产成人av在线观看 | 国产精品第一区揄拍无码 | 亚洲va欧美va天堂v国产综合 | 国产精品理论片在线观看 | 国产午夜无码视频在线观看 | 性开放的女人aaa片 | 欧美三级a做爰在线观看 | 欧洲熟妇精品视频 | 亚洲成色在线综合网站 | 国色天香社区在线视频 | 亚洲国产成人a精品不卡在线 | 久久人人97超碰a片精品 | a在线观看免费网站大全 | 激情内射日本一区二区三区 | 国产av无码专区亚洲a∨毛片 | ass日本丰满熟妇pics | 久久精品人人做人人综合 | 天堂亚洲免费视频 | 熟女少妇人妻中文字幕 | 又大又黄又粗又爽的免费视频 | 久久综合狠狠综合久久综合88 | 丝袜人妻一区二区三区 | 色综合久久久久综合一本到桃花网 | 国产精品毛片一区二区 | 国产av一区二区精品久久凹凸 | 99久久99久久免费精品蜜桃 | 高清国产亚洲精品自在久久 | 成年美女黄网站色大免费视频 | 成人无码视频免费播放 | 亚洲自偷自拍另类第1页 | 在线成人www免费观看视频 | 夜夜夜高潮夜夜爽夜夜爰爰 | 一本久久a久久精品亚洲 | 国产精品久久久久9999小说 | ass日本丰满熟妇pics | 欧美性色19p | 无套内谢老熟女 | 色综合久久88色综合天天 | 国产极品视觉盛宴 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲va中文字幕无码久久不卡 | 精品亚洲成av人在线观看 | 国产做国产爱免费视频 | 日本一本二本三区免费 | 亚洲国产精品久久久天堂 | 黑人粗大猛烈进出高潮视频 | 性欧美熟妇videofreesex | 精品少妇爆乳无码av无码专区 | 我要看www免费看插插视频 | 国产免费久久久久久无码 | 国产免费久久久久久无码 | 日日摸夜夜摸狠狠摸婷婷 | 99久久婷婷国产综合精品青草免费 | 国产精品手机免费 | 东京无码熟妇人妻av在线网址 | 久久国语露脸国产精品电影 | 久久久久久av无码免费看大片 | 国产性生交xxxxx无码 | 国产精品成人av在线观看 | 黑人玩弄人妻中文在线 | 国产成人精品无码播放 | 亚洲第一无码av无码专区 | 内射巨臀欧美在线视频 | 国内综合精品午夜久久资源 | 久久99精品久久久久婷婷 | 一二三四社区在线中文视频 | 日本熟妇大屁股人妻 | 十八禁视频网站在线观看 | 久久久久亚洲精品中文字幕 | 夜夜夜高潮夜夜爽夜夜爰爰 | 老子影院午夜精品无码 | 国产精品无码永久免费888 | 亚洲va欧美va天堂v国产综合 | 黄网在线观看免费网站 | 国产精品人人爽人人做我的可爱 | 精品国产av色一区二区深夜久久 | 强开小婷嫩苞又嫩又紧视频 | 精品国产乱码久久久久乱码 | 色综合久久久久综合一本到桃花网 | 在线观看国产午夜福利片 | 国产成人精品视频ⅴa片软件竹菊 | 成熟人妻av无码专区 | 无码av最新清无码专区吞精 | 欧美35页视频在线观看 | 三上悠亚人妻中文字幕在线 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 最近免费中文字幕中文高清百度 | 丰满人妻一区二区三区免费视频 | 成 人 网 站国产免费观看 | 色婷婷av一区二区三区之红樱桃 | 国产特级毛片aaaaaa高潮流水 | 88国产精品欧美一区二区三区 | 激情内射日本一区二区三区 | 精品一区二区不卡无码av | 未满成年国产在线观看 | 欧美老妇交乱视频在线观看 | 欧美人与动性行为视频 | 久久久久久a亚洲欧洲av冫 | 精品久久久中文字幕人妻 | 强伦人妻一区二区三区视频18 | 免费无码的av片在线观看 | 国产麻豆精品一区二区三区v视界 | 国产精品内射视频免费 | 亚洲精品久久久久久久久久久 | 精品欧洲av无码一区二区三区 | 国内精品九九久久久精品 | 丝袜 中出 制服 人妻 美腿 | av无码久久久久不卡免费网站 | 欧美日韩视频无码一区二区三 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 欧美日本日韩 | 国产精品亚洲一区二区三区喷水 | 欧美日韩人成综合在线播放 | 一本色道婷婷久久欧美 | 亚洲日韩中文字幕在线播放 | 无码人妻黑人中文字幕 | 东京无码熟妇人妻av在线网址 | 精品国产国产综合精品 | 一本无码人妻在中文字幕免费 | 大屁股大乳丰满人妻 | 麻花豆传媒剧国产免费mv在线 | 亚洲人成影院在线无码按摩店 | 国产偷国产偷精品高清尤物 | 亚洲午夜福利在线观看 | 中文字幕久久久久人妻 | 激情五月综合色婷婷一区二区 | 国产精品美女久久久久av爽李琼 | 99re在线播放 | 亚洲精品国产第一综合99久久 | 色狠狠av一区二区三区 | 午夜福利不卡在线视频 | 最近中文2019字幕第二页 | 成人一区二区免费视频 | 高清国产亚洲精品自在久久 | 日本一区二区三区免费播放 | 日本一区二区更新不卡 | 精品亚洲韩国一区二区三区 | 55夜色66夜色国产精品视频 | 男女猛烈xx00免费视频试看 | аⅴ资源天堂资源库在线 | 精品 日韩 国产 欧美 视频 | 亚洲中文无码av永久不收费 | 西西人体www44rt大胆高清 | 少妇厨房愉情理9仑片视频 | 午夜福利不卡在线视频 | 三上悠亚人妻中文字幕在线 | 中文精品无码中文字幕无码专区 | 日韩人妻系列无码专区 | 在线精品国产一区二区三区 | 中国女人内谢69xxxxxa片 | 波多野42部无码喷潮在线 | 久久99精品久久久久婷婷 | 国内精品人妻无码久久久影院 | 国产热a欧美热a在线视频 | 激情国产av做激情国产爱 | 国产成人无码午夜视频在线观看 | 欧美国产日产一区二区 | 中文字幕无码免费久久99 | 亚无码乱人伦一区二区 | 激情五月综合色婷婷一区二区 | 国产亚洲人成a在线v网站 | 欧美丰满熟妇xxxx性ppx人交 | 377p欧洲日本亚洲大胆 | 久久99久久99精品中文字幕 | 日本免费一区二区三区最新 | 欧美老妇交乱视频在线观看 | 成人一在线视频日韩国产 | 亚洲 日韩 欧美 成人 在线观看 | 精品国偷自产在线 | 日韩精品成人一区二区三区 | 日本熟妇浓毛 | 狂野欧美性猛交免费视频 | 成人免费视频一区二区 | 日本熟妇浓毛 | 麻豆蜜桃av蜜臀av色欲av | 国产精品无码一区二区三区不卡 | 18精品久久久无码午夜福利 | 性啪啪chinese东北女人 | 老熟女乱子伦 | 成人亚洲精品久久久久软件 | 色婷婷av一区二区三区之红樱桃 | 极品嫩模高潮叫床 | 国产莉萝无码av在线播放 | 性史性农村dvd毛片 | 性欧美大战久久久久久久 | 久久久久免费精品国产 | 亚洲精品中文字幕乱码 | 在线亚洲高清揄拍自拍一品区 | 疯狂三人交性欧美 | 精品国产一区二区三区四区 | 婷婷丁香六月激情综合啪 | 丰满诱人的人妻3 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲精品国产第一综合99久久 | 欧美午夜特黄aaaaaa片 | 欧洲精品码一区二区三区免费看 | 国产人妻久久精品二区三区老狼 | 亚洲理论电影在线观看 | 中文字幕+乱码+中文字幕一区 | 国产成人一区二区三区在线观看 | 午夜免费福利小电影 | aⅴ在线视频男人的天堂 | 天天躁日日躁狠狠躁免费麻豆 | 国产成人精品三级麻豆 | 激情内射亚州一区二区三区爱妻 | 一本大道伊人av久久综合 | 国产 精品 自在自线 | 无码帝国www无码专区色综合 | 国产成人av免费观看 | 精品人妻人人做人人爽 | 扒开双腿吃奶呻吟做受视频 | 久久久久成人精品免费播放动漫 | 中国女人内谢69xxxx | 十八禁真人啪啪免费网站 | 国产无遮挡又黄又爽免费视频 | 东京无码熟妇人妻av在线网址 | 亚洲熟妇色xxxxx欧美老妇 | 久久精品无码一区二区三区 | 午夜精品久久久久久久 | 久久国内精品自在自线 | 男女下面进入的视频免费午夜 | 国产97人人超碰caoprom | 久久久精品国产sm最大网站 | 成人精品一区二区三区中文字幕 | 日韩无码专区 | 日本精品人妻无码77777 天堂一区人妻无码 | 精品国产精品久久一区免费式 | 在线a亚洲视频播放在线观看 | 国产在线精品一区二区三区直播 | 免费观看又污又黄的网站 | 97夜夜澡人人双人人人喊 | 久久久婷婷五月亚洲97号色 | 久久久久久亚洲精品a片成人 | 妺妺窝人体色www婷婷 | 欧美人与禽猛交狂配 | 色婷婷av一区二区三区之红樱桃 | 荫蒂添的好舒服视频囗交 | 久久综合久久自在自线精品自 | 学生妹亚洲一区二区 | 熟妇激情内射com | 国产精品va在线观看无码 | 欧美激情一区二区三区成人 | 亚洲日韩av一区二区三区中文 | 一本色道婷婷久久欧美 | 亚洲中文字幕无码中文字在线 | 亚洲综合伊人久久大杳蕉 | 亚洲综合久久一区二区 | 欧美 日韩 亚洲 在线 | 国产人妻人伦精品1国产丝袜 | 午夜成人1000部免费视频 | 波多野结衣乳巨码无在线观看 | 色五月五月丁香亚洲综合网 | 亚洲成av人片天堂网无码】 | 亚洲欧洲日本综合aⅴ在线 | 精品无码一区二区三区的天堂 | 131美女爱做视频 | 无码福利日韩神码福利片 | 国产69精品久久久久app下载 | 俺去俺来也在线www色官网 | 日产精品高潮呻吟av久久 | 欧美丰满少妇xxxx性 | 99国产精品白浆在线观看免费 | 自拍偷自拍亚洲精品10p | 日韩 欧美 动漫 国产 制服 | 欧美 丝袜 自拍 制服 另类 | 色综合久久久无码中文字幕 | 人人妻人人澡人人爽欧美一区 | 5858s亚洲色大成网站www | 在线看片无码永久免费视频 | 国产精品无码成人午夜电影 | 成人欧美一区二区三区 | 久久久久免费看成人影片 | 日本一本二本三区免费 | 日韩视频 中文字幕 视频一区 | 老太婆性杂交欧美肥老太 | 一本色道久久综合亚洲精品不卡 | 一个人免费观看的www视频 | 最近中文2019字幕第二页 | 亚洲爆乳精品无码一区二区三区 | 亚洲精品久久久久avwww潮水 | 国产乡下妇女做爰 | 少妇久久久久久人妻无码 | 中文精品久久久久人妻不卡 | 久久久久久久久888 | 天天摸天天碰天天添 | 97久久超碰中文字幕 | 国产农村妇女高潮大叫 | 男女下面进入的视频免费午夜 | 扒开双腿疯狂进出爽爽爽视频 | 高潮毛片无遮挡高清免费 | 国产免费无码一区二区视频 | 日日天日日夜日日摸 | 国产亚洲精品久久久久久国模美 | 国产真人无遮挡作爱免费视频 | 夜先锋av资源网站 | 99久久精品国产一区二区蜜芽 | 精品国产国产综合精品 | 亚洲 激情 小说 另类 欧美 | 国产亚洲欧美日韩亚洲中文色 | 狠狠色欧美亚洲狠狠色www | 亚洲国产av精品一区二区蜜芽 | 亚洲中文字幕无码中字 | 亚洲精品国产精品乱码不卡 | 精品亚洲韩国一区二区三区 | 99国产欧美久久久精品 | 中国大陆精品视频xxxx | 色情久久久av熟女人妻网站 | 国产免费久久久久久无码 | 日韩成人一区二区三区在线观看 | 亚洲熟妇色xxxxx亚洲 | 99久久婷婷国产综合精品青草免费 | 成人毛片一区二区 | 久久综合九色综合97网 | 日本乱人伦片中文三区 | 国产午夜精品一区二区三区嫩草 | 中文字幕亚洲情99在线 | 一区二区传媒有限公司 | 宝宝好涨水快流出来免费视频 | 中文字幕无码乱人伦 | 双乳奶水饱满少妇呻吟 | 性生交片免费无码看人 | 午夜丰满少妇性开放视频 | 亚洲人成网站色7799 | 一本大道伊人av久久综合 | 国产真人无遮挡作爱免费视频 | 双乳奶水饱满少妇呻吟 | 精品人妻人人做人人爽 | 桃花色综合影院 | 亚洲国产精品一区二区美利坚 | 一区二区三区乱码在线 | 欧洲 | 97夜夜澡人人爽人人喊中国片 | 午夜福利电影 | 国产亚洲精品久久久久久久 | 久久天天躁狠狠躁夜夜免费观看 | 国产精品亚洲综合色区韩国 | 亚洲精品一区三区三区在线观看 | 综合人妻久久一区二区精品 | 精品亚洲韩国一区二区三区 | 爽爽影院免费观看 | 妺妺窝人体色www婷婷 | 蜜桃视频插满18在线观看 | 国产午夜亚洲精品不卡下载 | 大肉大捧一进一出视频出来呀 | 亚洲日韩乱码中文无码蜜桃臀网站 | 人妻互换免费中文字幕 | 高潮毛片无遮挡高清免费视频 | 在线亚洲高清揄拍自拍一品区 | 无码国模国产在线观看 | 88国产精品欧美一区二区三区 | 亚洲欧洲日本综合aⅴ在线 | 亚洲日韩一区二区三区 | 97夜夜澡人人双人人人喊 | 欧美亚洲国产一区二区三区 | 国产亲子乱弄免费视频 | 高潮毛片无遮挡高清免费 | 丝袜 中出 制服 人妻 美腿 | 国产人妖乱国产精品人妖 | 欧美国产日韩亚洲中文 | 色综合久久中文娱乐网 | √天堂资源地址中文在线 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国模大胆一区二区三区 | 18禁止看的免费污网站 | 激情国产av做激情国产爱 | 国产成人精品三级麻豆 | 国产成人综合色在线观看网站 | 国产色在线 | 国产 | 国产精品办公室沙发 | 欧美真人作爱免费视频 | 亚洲天堂2017无码 | 亚洲の无码国产の无码步美 | 日本饥渴人妻欲求不满 | 大乳丰满人妻中文字幕日本 | 亚洲a无码综合a国产av中文 | 美女极度色诱视频国产 | 日本精品高清一区二区 | 国产亚洲美女精品久久久2020 | 久久人人爽人人爽人人片av高清 | 久青草影院在线观看国产 | 久久五月精品中文字幕 | 扒开双腿吃奶呻吟做受视频 | 色欲av亚洲一区无码少妇 | 国产97人人超碰caoprom | 狠狠色欧美亚洲狠狠色www | 伊人久久大香线焦av综合影院 | 亚洲精品一区二区三区在线 | 97精品人妻一区二区三区香蕉 | 麻花豆传媒剧国产免费mv在线 | 国产成人精品视频ⅴa片软件竹菊 | 国产成人无码午夜视频在线观看 | 亚洲色在线无码国产精品不卡 | 精品厕所偷拍各类美女tp嘘嘘 | 高清不卡一区二区三区 | 玩弄人妻少妇500系列视频 | 人妻天天爽夜夜爽一区二区 | 国内精品人妻无码久久久影院蜜桃 | 成人欧美一区二区三区黑人 | 狠狠色欧美亚洲狠狠色www | 青春草在线视频免费观看 | 丝袜 中出 制服 人妻 美腿 | 精品人人妻人人澡人人爽人人 | 欧美性生交活xxxxxdddd | 久久人人97超碰a片精品 | 国产美女极度色诱视频www | 免费国产黄网站在线观看 | 国产在线一区二区三区四区五区 | 亚洲国产精华液网站w | 最新国产乱人伦偷精品免费网站 | 99久久99久久免费精品蜜桃 | 四十如虎的丰满熟妇啪啪 | 中文无码精品a∨在线观看不卡 | 久9re热视频这里只有精品 | 午夜福利电影 | 国产人妻精品午夜福利免费 | 性史性农村dvd毛片 | 澳门永久av免费网站 | 国产精品欧美成人 | 波多野42部无码喷潮在线 | 大肉大捧一进一出好爽视频 | 一本久道高清无码视频 | 欧美 亚洲 国产 另类 | 久久人人97超碰a片精品 | 少妇久久久久久人妻无码 | 狠狠色噜噜狠狠狠7777奇米 | 国产农村乱对白刺激视频 | 日本肉体xxxx裸交 | 成人免费视频在线观看 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲中文字幕无码中字 | 精品一区二区三区波多野结衣 | 久久无码人妻影院 | 久久精品一区二区三区四区 | 久久久久久久女国产乱让韩 | 成人一在线视频日韩国产 | 日产精品99久久久久久 | 国内揄拍国内精品少妇国语 | 男人和女人高潮免费网站 | www国产亚洲精品久久网站 | 亚洲热妇无码av在线播放 | 日本熟妇人妻xxxxx人hd | 免费无码午夜福利片69 | 日韩av无码一区二区三区 | 嫩b人妻精品一区二区三区 | 麻豆精产国品 | 国产精品第一区揄拍无码 | 亚洲成av人片在线观看无码不卡 | 国产无遮挡又黄又爽又色 | 精品 日韩 国产 欧美 视频 | 国内少妇偷人精品视频免费 | 国产97人人超碰caoprom | 国产人妻久久精品二区三区老狼 | 1000部啪啪未满十八勿入下载 | 老熟妇仑乱视频一区二区 | 国产午夜精品一区二区三区嫩草 | 久久综合给合久久狠狠狠97色 | 日韩精品无码一区二区中文字幕 | 97色伦图片97综合影院 | 四虎国产精品一区二区 | 久久精品国产大片免费观看 | 一二三四社区在线中文视频 | 欧美 日韩 亚洲 在线 | 久久国产自偷自偷免费一区调 | 强伦人妻一区二区三区视频18 | 国产女主播喷水视频在线观看 | 成人动漫在线观看 | 久久综合网欧美色妞网 | 在线精品国产一区二区三区 | 国产亚洲欧美在线专区 | 性欧美牲交xxxxx视频 | 国产香蕉尹人视频在线 | 97久久精品无码一区二区 | 国产乱码精品一品二品 | 色欲综合久久中文字幕网 | 无码人中文字幕 | 日本精品高清一区二区 | 亚洲综合伊人久久大杳蕉 | 日本www一道久久久免费榴莲 | 无码福利日韩神码福利片 | 丰满少妇人妻久久久久久 | 久久综合给合久久狠狠狠97色 | 天天做天天爱天天爽综合网 | 成人亚洲精品久久久久 | 中文字幕无码免费久久9一区9 | 红桃av一区二区三区在线无码av | 精品一区二区不卡无码av | 国产精品第一国产精品 | 性欧美牲交在线视频 | 亚欧洲精品在线视频免费观看 | 5858s亚洲色大成网站www | 午夜福利一区二区三区在线观看 | 亚洲爆乳无码专区 | 水蜜桃色314在线观看 | 日韩精品久久久肉伦网站 | 国产精品沙发午睡系列 | 成人三级无码视频在线观看 | 人妻无码久久精品人妻 | 国产一区二区三区精品视频 | 日日麻批免费40分钟无码 | 日本又色又爽又黄的a片18禁 | 东北女人啪啪对白 | 国产亚洲精品久久久久久国模美 | 乱码av麻豆丝袜熟女系列 | 久久久久亚洲精品男人的天堂 | 亚洲国产欧美国产综合一区 | 国产三级久久久精品麻豆三级 | 亚洲a无码综合a国产av中文 | 国内少妇偷人精品视频免费 | 99久久久无码国产aaa精品 | 久久久久国色av免费观看性色 | 亚洲精品综合五月久久小说 | 黑人巨大精品欧美一区二区 | 久久综合香蕉国产蜜臀av | 欧美喷潮久久久xxxxx | 欧美人妻一区二区三区 | 亚洲成熟女人毛毛耸耸多 | 国产精品办公室沙发 | 少妇性l交大片欧洲热妇乱xxx | 麻豆蜜桃av蜜臀av色欲av | 亚洲一区二区三区在线观看网站 | 免费中文字幕日韩欧美 | 国产精品无码一区二区桃花视频 | а天堂中文在线官网 | 最新国产麻豆aⅴ精品无码 | 一本精品99久久精品77 | 三上悠亚人妻中文字幕在线 | 麻豆果冻传媒2021精品传媒一区下载 | 一区二区三区高清视频一 | 性欧美牲交xxxxx视频 | 国产乱子伦视频在线播放 | 黑人玩弄人妻中文在线 | 久久久精品456亚洲影院 | 亚洲国产欧美国产综合一区 | 强开小婷嫩苞又嫩又紧视频 | 亚洲gv猛男gv无码男同 | 激情亚洲一区国产精品 | 亚洲无人区午夜福利码高清完整版 | 亚洲日本一区二区三区在线 | 亚洲国精产品一二二线 | 精品国产一区av天美传媒 | 成人三级无码视频在线观看 | v一区无码内射国产 | 天堂在线观看www | 九一九色国产 | 福利一区二区三区视频在线观看 | 人人爽人人爽人人片av亚洲 | 国产亚洲精品久久久久久国模美 | 久久国产36精品色熟妇 | 亚洲欧美中文字幕5发布 | 亚洲精品鲁一鲁一区二区三区 | 精品一区二区三区无码免费视频 | 免费观看激色视频网站 | 一个人看的视频www在线 | 成人影院yy111111在线观看 | 性欧美疯狂xxxxbbbb | 亚洲精品一区二区三区四区五区 | 日本一本二本三区免费 | 少妇久久久久久人妻无码 | 午夜男女很黄的视频 | 国产精品对白交换视频 | 亚洲国产一区二区三区在线观看 | 亚洲欧洲中文日韩av乱码 | 国产手机在线αⅴ片无码观看 | 国产熟女一区二区三区四区五区 | 99精品久久毛片a片 | 无码人中文字幕 | 亚洲精品久久久久avwww潮水 | 国产成人无码av在线影院 | 亚洲伊人久久精品影院 | 桃花色综合影院 | 丰满妇女强制高潮18xxxx | 亚洲色无码一区二区三区 | 国产无遮挡又黄又爽又色 | 亚洲精品中文字幕乱码 | 亚洲一区二区三区无码久久 | 免费视频欧美无人区码 | 亚洲熟妇自偷自拍另类 | 一区二区三区高清视频一 | 成熟人妻av无码专区 | 久久精品中文闷骚内射 | 俺去俺来也www色官网 | 免费乱码人妻系列无码专区 | 少妇高潮一区二区三区99 | 精品无码av一区二区三区 | 在教室伦流澡到高潮hnp视频 | 装睡被陌生人摸出水好爽 | 亚洲精品一区二区三区大桥未久 | 久久久久久九九精品久 | 国产精品亚洲一区二区三区喷水 | 婷婷五月综合缴情在线视频 | 国产精品va在线观看无码 | 亚洲第一网站男人都懂 | 国产日产欧产精品精品app | 亚洲高清偷拍一区二区三区 | 国产精华av午夜在线观看 | 丰满人妻精品国产99aⅴ | 国内精品人妻无码久久久影院蜜桃 | 精品偷自拍另类在线观看 | 日韩av无码一区二区三区不卡 | 日产精品高潮呻吟av久久 | 露脸叫床粗话东北少妇 | 日韩精品一区二区av在线 | 国产精品无码成人午夜电影 | 国产亚洲人成在线播放 | 无码吃奶揉捏奶头高潮视频 | 亚洲aⅴ无码成人网站国产app | 欧美激情一区二区三区成人 | a国产一区二区免费入口 | 国产免费久久久久久无码 | 久久99国产综合精品 | 久久久久免费看成人影片 | 国内精品久久毛片一区二区 | 国产亚洲精品久久久闺蜜 | 一本色道久久综合亚洲精品不卡 | 国产av一区二区三区最新精品 | 大色综合色综合网站 | 久久久久久a亚洲欧洲av冫 | 高潮毛片无遮挡高清免费 | 2020最新国产自产精品 | 奇米影视7777久久精品人人爽 | 好爽又高潮了毛片免费下载 | 欧美老妇交乱视频在线观看 | 国产精品国产三级国产专播 | 人妻无码αv中文字幕久久琪琪布 | 色婷婷综合中文久久一本 | 波多野42部无码喷潮在线 | 国产精品久久久久久久9999 | 久久午夜夜伦鲁鲁片无码免费 | 国产熟妇高潮叫床视频播放 | 日韩亚洲欧美中文高清在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 欧美野外疯狂做受xxxx高潮 | 老熟妇仑乱视频一区二区 | 中文无码伦av中文字幕 | 欧美成人高清在线播放 | 国产激情艳情在线看视频 | 少妇久久久久久人妻无码 | 成人毛片一区二区 | 妺妺窝人体色www婷婷 | 精品国精品国产自在久国产87 | 俺去俺来也在线www色官网 | 欧美野外疯狂做受xxxx高潮 | 国产精品永久免费视频 | 99久久精品午夜一区二区 | 夜夜高潮次次欢爽av女 | 国产精品久久久久9999小说 | 影音先锋中文字幕无码 | 日日天干夜夜狠狠爱 | 人妻互换免费中文字幕 | 国产偷国产偷精品高清尤物 | 青青青手机频在线观看 | 亚洲最大成人网站 | 一本久道久久综合狠狠爱 | 久久久亚洲欧洲日产国码αv | 精品成人av一区二区三区 | 性啪啪chinese东北女人 | 欧美zoozzooz性欧美 | 激情内射亚州一区二区三区爱妻 | √8天堂资源地址中文在线 | 国产av久久久久精东av | 日日天干夜夜狠狠爱 | 西西人体www44rt大胆高清 | 无码人妻丰满熟妇区毛片18 | 国产办公室秘书无码精品99 | 2020久久香蕉国产线看观看 | 欧美日韩亚洲国产精品 | 高潮毛片无遮挡高清免费视频 | 国产精品99爱免费视频 | 亚洲va欧美va天堂v国产综合 | 97资源共享在线视频 | 美女极度色诱视频国产 | 装睡被陌生人摸出水好爽 | 亚洲无人区一区二区三区 | 麻豆md0077饥渴少妇 | 色诱久久久久综合网ywww | 国产色xx群视频射精 | 久久国产劲爆∧v内射 | 久久99久久99精品中文字幕 | 性色欲情网站iwww九文堂 | 人妻少妇精品视频专区 | 日本www一道久久久免费榴莲 | 99久久亚洲精品无码毛片 | 国产极品视觉盛宴 | 美女扒开屁股让男人桶 | 国产真实乱对白精彩久久 | 老熟妇仑乱视频一区二区 | 小sao货水好多真紧h无码视频 | 久久久国产精品无码免费专区 | 欧美激情一区二区三区成人 | 国产凸凹视频一区二区 | 精品久久久久久人妻无码中文字幕 | 乱人伦人妻中文字幕无码 | 国产激情艳情在线看视频 | 国产亚洲精品精品国产亚洲综合 | 亚洲中文字幕在线无码一区二区 | 无码精品国产va在线观看dvd | 大肉大捧一进一出好爽视频 | 亚洲国产一区二区三区在线观看 | 人妻少妇精品无码专区二区 | 99久久精品无码一区二区毛片 | 色综合视频一区二区三区 | 欧美性黑人极品hd | 水蜜桃av无码 | 高清无码午夜福利视频 | 国产卡一卡二卡三 | 中文字幕精品av一区二区五区 | 丰满少妇女裸体bbw | 永久免费观看美女裸体的网站 | 亚洲 a v无 码免 费 成 人 a v | 夜精品a片一区二区三区无码白浆 | 人妻少妇被猛烈进入中文字幕 | 成人亚洲精品久久久久软件 | 中文字幕精品av一区二区五区 | 青青草原综合久久大伊人精品 | 亚洲色偷偷男人的天堂 | аⅴ资源天堂资源库在线 | 亚洲国产综合无码一区 | 亚洲熟悉妇女xxx妇女av | 少妇久久久久久人妻无码 | 成人精品视频一区二区 | 久久国产劲爆∧v内射 | 在线欧美精品一区二区三区 | 98国产精品综合一区二区三区 | 欧美丰满少妇xxxx性 | 麻豆md0077饥渴少妇 | 国产精品永久免费视频 | 国产va免费精品观看 | 精品久久久无码人妻字幂 | 中文字幕人成乱码熟女app | 国产热a欧美热a在线视频 | www成人国产高清内射 | 国产成人无码av一区二区 | 久久久中文久久久无码 | 色欲人妻aaaaaaa无码 | 午夜熟女插插xx免费视频 | 成熟女人特级毛片www免费 | 大地资源网第二页免费观看 | 亚洲一区二区三区香蕉 | 国产精品久久久久久亚洲影视内衣 | 麻豆国产人妻欲求不满谁演的 | 欧美丰满少妇xxxx性 | 久久 国产 尿 小便 嘘嘘 | 国产成人精品视频ⅴa片软件竹菊 | 日本高清一区免费中文视频 | 欧美乱妇无乱码大黄a片 | 欧美人与善在线com | 撕开奶罩揉吮奶头视频 | 国产乱人无码伦av在线a | 成人无码视频免费播放 | 国产人妻人伦精品1国产丝袜 | 又紧又大又爽精品一区二区 | 亚洲va欧美va天堂v国产综合 | 免费观看激色视频网站 | 久久久久免费看成人影片 | 亚洲色欲久久久综合网东京热 | 自拍偷自拍亚洲精品被多人伦好爽 | 动漫av一区二区在线观看 | 精品无人国产偷自产在线 | 亚洲欧美精品aaaaaa片 | 人人妻人人澡人人爽精品欧美 | 欧美亚洲日韩国产人成在线播放 | 久久亚洲国产成人精品性色 | 亚洲国产成人a精品不卡在线 | 奇米影视7777久久精品人人爽 | 粉嫩少妇内射浓精videos | 无码一区二区三区在线 | 精品无码国产自产拍在线观看蜜 | 久久亚洲日韩精品一区二区三区 | 久久国内精品自在自线 | 四虎国产精品一区二区 | 国产乱人无码伦av在线a | 国产精品毛片一区二区 | 精品久久8x国产免费观看 | 国产农村乱对白刺激视频 | 精品无码一区二区三区爱欲 | 国产精品久久久久9999小说 | 人人澡人人妻人人爽人人蜜桃 | 久精品国产欧美亚洲色aⅴ大片 | av人摸人人人澡人人超碰下载 | 精品国产一区二区三区四区 | 无码国产色欲xxxxx视频 | 久久精品人人做人人综合 | 色偷偷人人澡人人爽人人模 | 97精品国产97久久久久久免费 | 精品偷自拍另类在线观看 | 欧美老人巨大xxxx做受 | 青春草在线视频免费观看 | 图片区 小说区 区 亚洲五月 | 99国产欧美久久久精品 | 国产亚洲精品久久久久久大师 | 日韩人妻无码一区二区三区久久99 | 国内精品久久久久久中文字幕 | 亚洲国产av精品一区二区蜜芽 | 国产9 9在线 | 中文 | 四虎影视成人永久免费观看视频 | 扒开双腿吃奶呻吟做受视频 | 青青久在线视频免费观看 | 六月丁香婷婷色狠狠久久 | 中国女人内谢69xxxxxa片 | 波多野结衣av在线观看 | 强伦人妻一区二区三区视频18 | 精品人妻人人做人人爽夜夜爽 | 欧美成人家庭影院 | 大肉大捧一进一出好爽视频 | 久久99精品国产.久久久久 | 久久综合色之久久综合 | 青青青手机频在线观看 | 亚洲成a人片在线观看无码 | 中文字幕久久久久人妻 | 日韩精品a片一区二区三区妖精 | 成人女人看片免费视频放人 | 狂野欧美性猛xxxx乱大交 | 亚洲中文字幕va福利 | 日产精品99久久久久久 | 欧美日本免费一区二区三区 | 国产精品久久久久久久9999 | 精品无码成人片一区二区98 | v一区无码内射国产 | 国产成人人人97超碰超爽8 | 国产精品无码成人午夜电影 | 国产极品视觉盛宴 | 国产精品第一国产精品 | 亚洲精品无码人妻无码 | 精品久久久无码中文字幕 | 三上悠亚人妻中文字幕在线 | 精品国偷自产在线视频 | 日韩人妻系列无码专区 | 无遮挡国产高潮视频免费观看 | 久久 国产 尿 小便 嘘嘘 | 国内精品人妻无码久久久影院 | 老熟女乱子伦 | 久久zyz资源站无码中文动漫 | √8天堂资源地址中文在线 | 国产深夜福利视频在线 | 最近中文2019字幕第二页 | 国産精品久久久久久久 | 精品无码国产自产拍在线观看蜜 | 久久人人97超碰a片精品 | 图片区 小说区 区 亚洲五月 | 国产午夜精品一区二区三区嫩草 | 亚洲国产高清在线观看视频 | 日本高清一区免费中文视频 | 人妻少妇精品无码专区二区 | 自拍偷自拍亚洲精品被多人伦好爽 | 精品夜夜澡人妻无码av蜜桃 | 欧美大屁股xxxxhd黑色 | 极品尤物被啪到呻吟喷水 | 亚洲成a人片在线观看无码3d | 给我免费的视频在线观看 | 97久久国产亚洲精品超碰热 | 亚洲成av人片在线观看无码不卡 | 国产在线无码精品电影网 | 国产超级va在线观看视频 | 国产激情无码一区二区 | 国内少妇偷人精品视频 | 大地资源中文第3页 | 国产成人精品久久亚洲高清不卡 | 荫蒂被男人添的好舒服爽免费视频 | 岛国片人妻三上悠亚 | 九九热爱视频精品 | 丰满少妇人妻久久久久久 | 国内精品久久毛片一区二区 | 中文字幕人成乱码熟女app | 色综合天天综合狠狠爱 | 图片区 小说区 区 亚洲五月 | 日本一卡二卡不卡视频查询 | 欧美熟妇另类久久久久久不卡 | 全黄性性激高免费视频 | 动漫av一区二区在线观看 | 色一情一乱一伦一视频免费看 | 色综合久久久久综合一本到桃花网 | 欧美 亚洲 国产 另类 | 无码人妻av免费一区二区三区 | a国产一区二区免费入口 | 蜜桃无码一区二区三区 | 国产精品.xx视频.xxtv | 澳门永久av免费网站 | 男女猛烈xx00免费视频试看 | 丝袜足控一区二区三区 | 成年美女黄网站色大免费视频 | 欧美日韩综合一区二区三区 | 国产精品久久久久影院嫩草 | 天堂无码人妻精品一区二区三区 | 午夜福利不卡在线视频 | 亚洲精品无码国产 | 亚洲天堂2017无码中文 | 少妇人妻大乳在线视频 | 久9re热视频这里只有精品 | 国产色精品久久人妻 | 精品国产乱码久久久久乱码 | 少妇无码一区二区二三区 | 中文无码伦av中文字幕 | 久久99精品国产.久久久久 | 日本一本二本三区免费 | 青青久在线视频免费观看 | 国精品人妻无码一区二区三区蜜柚 | 丰满少妇弄高潮了www | 国产午夜福利亚洲第一 | 精品日本一区二区三区在线观看 | 国产精品久久国产精品99 | 少妇人妻偷人精品无码视频 | 一本久久a久久精品vr综合 | 久久久国产一区二区三区 | 色综合天天综合狠狠爱 | 超碰97人人做人人爱少妇 | 人人澡人人透人人爽 | 日韩精品a片一区二区三区妖精 | 少女韩国电视剧在线观看完整 | 国产精品高潮呻吟av久久4虎 | 欧美人与牲动交xxxx | 狠狠色噜噜狠狠狠狠7777米奇 | 婷婷丁香六月激情综合啪 | 欧美三级a做爰在线观看 | 少妇性俱乐部纵欲狂欢电影 | 亚洲va中文字幕无码久久不卡 | 成人无码视频在线观看网站 | 欧美成人午夜精品久久久 | 精品人妻人人做人人爽 | 性欧美牲交xxxxx视频 | 精品人妻中文字幕有码在线 | 粉嫩少妇内射浓精videos | 永久免费观看国产裸体美女 | 国产无遮挡又黄又爽又色 | 成 人影片 免费观看 | 在线播放免费人成毛片乱码 | 少妇无码av无码专区在线观看 | 欧美精品在线观看 | 女人被男人躁得好爽免费视频 | 草草网站影院白丝内射 | 一本久道久久综合狠狠爱 | 成 人影片 免费观看 | 亚洲区小说区激情区图片区 | 天海翼激烈高潮到腰振不止 | 国产亚洲精品久久久久久大师 | 小鲜肉自慰网站xnxx | 国产两女互慰高潮视频在线观看 | 国产极品美女高潮无套在线观看 | 亚洲男人av天堂午夜在 | 久久天天躁狠狠躁夜夜免费观看 | 久久久精品欧美一区二区免费 | 人人澡人人妻人人爽人人蜜桃 | 亚洲第一网站男人都懂 | 免费看男女做好爽好硬视频 | 精品乱子伦一区二区三区 | 亚洲人成影院在线观看 | 丰满肥臀大屁股熟妇激情视频 | 精品人妻中文字幕有码在线 | 蜜臀av无码人妻精品 | 无码一区二区三区在线 | 国产成人无码a区在线观看视频app | 爱做久久久久久 | 无码人妻丰满熟妇区五十路百度 |