3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > 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 应用程序的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    国产人妖乱国产精品人妖 | 久久久久久久人妻无码中文字幕爆 | 麻豆果冻传媒2021精品传媒一区下载 | 久久精品国产精品国产精品污 | 国产激情综合五月久久 | аⅴ资源天堂资源库在线 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 女人被男人爽到呻吟的视频 | 性生交大片免费看女人按摩摩 | 内射后入在线观看一区 | 97无码免费人妻超级碰碰夜夜 | 午夜精品一区二区三区在线观看 | 国产精品丝袜黑色高跟鞋 | 国产特级毛片aaaaaaa高清 | 久久人人97超碰a片精品 | 亚洲精品久久久久久一区二区 | 亚洲精品国偷拍自产在线麻豆 | 又紧又大又爽精品一区二区 | 亚洲日本va中文字幕 | 亚洲精品一区二区三区四区五区 | 久久精品国产大片免费观看 | 九九热爱视频精品 | 少妇厨房愉情理9仑片视频 | 天堂无码人妻精品一区二区三区 | 日本丰满护士爆乳xxxx | 亚洲精品综合一区二区三区在线 | 中文字幕 人妻熟女 | 欧美国产日产一区二区 | 67194成是人免费无码 | 狠狠亚洲超碰狼人久久 | 人妻夜夜爽天天爽三区 | 亚洲乱码国产乱码精品精 | 亚洲精品午夜国产va久久成人 | 精品国产av色一区二区深夜久久 | 性欧美牲交在线视频 | 夜精品a片一区二区三区无码白浆 | 精品国产一区二区三区四区 | 国产av剧情md精品麻豆 | 亚洲欧美日韩综合久久久 | 久久视频在线观看精品 | 国产超级va在线观看视频 | 漂亮人妻洗澡被公强 日日躁 | 成人毛片一区二区 | 亚洲区欧美区综合区自拍区 | 精品国产乱码久久久久乱码 | 欧美亚洲日韩国产人成在线播放 | 天堂无码人妻精品一区二区三区 | 久久zyz资源站无码中文动漫 | 黑森林福利视频导航 | 成在人线av无码免观看麻豆 | 亚洲精品成人福利网站 | 超碰97人人做人人爱少妇 | 国产精品久久久久久久9999 | 亚洲一区二区三区四区 | 免费观看黄网站 | 亚洲欧美综合区丁香五月小说 | 久久无码中文字幕免费影院蜜桃 | 东北女人啪啪对白 | 亚洲国产精品久久人人爱 | 奇米影视888欧美在线观看 | 中国大陆精品视频xxxx | 美女极度色诱视频国产 | 国产热a欧美热a在线视频 | 人妻互换免费中文字幕 | 国产精品成人av在线观看 | 波多野结衣高清一区二区三区 | 国产精品a成v人在线播放 | 欧美猛少妇色xxxxx | 一区二区传媒有限公司 | 精品亚洲成av人在线观看 | 中文字幕久久久久人妻 | 在教室伦流澡到高潮hnp视频 | 大地资源网第二页免费观看 | 无码av免费一区二区三区试看 | 国产精品亚洲а∨无码播放麻豆 | 成人无码精品一区二区三区 | 欧美丰满熟妇xxxx性ppx人交 | 国产乱人偷精品人妻a片 | 人人妻人人澡人人爽人人精品浪潮 | 国产精品无码一区二区桃花视频 | 亚洲国产欧美日韩精品一区二区三区 | 樱花草在线社区www | 久激情内射婷内射蜜桃人妖 | 国产激情艳情在线看视频 | 麻豆人妻少妇精品无码专区 | 性色欲网站人妻丰满中文久久不卡 | 男女爱爱好爽视频免费看 | 国产福利视频一区二区 | 大肉大捧一进一出好爽视频 | 久久国内精品自在自线 | 国产极品美女高潮无套在线观看 | 人妻体内射精一区二区三四 | 日本www一道久久久免费榴莲 | 成人试看120秒体验区 | 无码人妻丰满熟妇区毛片18 | 377p欧洲日本亚洲大胆 | 女人被男人爽到呻吟的视频 | 精品国产福利一区二区 | 日韩亚洲欧美中文高清在线 | 狠狠色噜噜狠狠狠7777奇米 | 一个人看的视频www在线 | 性色av无码免费一区二区三区 | 51国偷自产一区二区三区 | 国产乱人偷精品人妻a片 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 亚洲综合精品香蕉久久网 | www成人国产高清内射 | 久久午夜夜伦鲁鲁片无码免费 | 在线观看国产一区二区三区 | 乱码av麻豆丝袜熟女系列 | 亚洲精品无码国产 | 性欧美牲交xxxxx视频 | 日本乱人伦片中文三区 | 水蜜桃色314在线观看 | 亚洲人亚洲人成电影网站色 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 亚洲国产av精品一区二区蜜芽 | 妺妺窝人体色www在线小说 | 国产小呦泬泬99精品 | 综合人妻久久一区二区精品 | 亚洲爆乳精品无码一区二区三区 | 国产福利视频一区二区 | 成人性做爰aaa片免费看不忠 | 成熟妇人a片免费看网站 | 疯狂三人交性欧美 | 日产精品99久久久久久 | 乱人伦人妻中文字幕无码 | 久久精品一区二区三区四区 | 日韩欧美中文字幕在线三区 | 国产精品高潮呻吟av久久4虎 | 人人妻人人澡人人爽欧美精品 | 成人欧美一区二区三区黑人免费 | 亚洲色成人中文字幕网站 | 亚洲国产精品美女久久久久 | 性生交片免费无码看人 | 波多野结衣av在线观看 | 无遮挡国产高潮视频免费观看 | 国产免费观看黄av片 | 一本久久a久久精品亚洲 | 国产真实伦对白全集 | 国产精品久久久久久无码 | 欧美国产日产一区二区 | 伊在人天堂亚洲香蕉精品区 | 领导边摸边吃奶边做爽在线观看 | 丰腴饱满的极品熟妇 | 99久久久无码国产精品免费 | 又大又硬又爽免费视频 | 国产午夜精品一区二区三区嫩草 | 思思久久99热只有频精品66 | 一二三四社区在线中文视频 | 精品久久久久久亚洲精品 | 成人片黄网站色大片免费观看 | 国产精品无码一区二区三区不卡 | 熟女体下毛毛黑森林 | 国产熟女一区二区三区四区五区 | 国产色xx群视频射精 | 亚洲大尺度无码无码专区 | 精品无码国产自产拍在线观看蜜 | 中文字幕无线码 | 中文字幕av伊人av无码av | 欧美亚洲日韩国产人成在线播放 | 亚洲一区二区三区香蕉 | 亚洲成熟女人毛毛耸耸多 | 久久99精品久久久久久 | 免费无码的av片在线观看 | 日韩人妻系列无码专区 | 99国产精品白浆在线观看免费 | 伊人久久大香线蕉亚洲 | 少妇愉情理伦片bd | 国产一区二区三区四区五区加勒比 | 久久精品国产亚洲精品 | 男女性色大片免费网站 | 岛国片人妻三上悠亚 | 精品国产福利一区二区 | 免费观看激色视频网站 | 亚洲国产精品一区二区美利坚 | 扒开双腿吃奶呻吟做受视频 | av人摸人人人澡人人超碰下载 | aⅴ在线视频男人的天堂 | 狠狠色噜噜狠狠狠7777奇米 | 一本久道久久综合狠狠爱 | 欧美xxxx黑人又粗又长 | 日韩精品无码免费一区二区三区 | 狠狠综合久久久久综合网 | 午夜成人1000部免费视频 | 国产高潮视频在线观看 | 欧美xxxxx精品 | 久久精品视频在线看15 | 亚洲性无码av中文字幕 | 亚洲精品一区二区三区四区五区 | 国产无遮挡又黄又爽又色 | 亚洲の无码国产の无码影院 | 无码av岛国片在线播放 | 精品久久综合1区2区3区激情 | 久久精品国产亚洲精品 | 欧美三级不卡在线观看 | 国产精品无码一区二区桃花视频 | 国产亚洲日韩欧美另类第八页 | 正在播放老肥熟妇露脸 | 性生交大片免费看l | 中文亚洲成a人片在线观看 | 亚洲精品久久久久久久久久久 | 久久久www成人免费毛片 | 丰腴饱满的极品熟妇 | 无码乱肉视频免费大全合集 | 黄网在线观看免费网站 | 精品国产福利一区二区 | 亚洲成av人影院在线观看 | 亚洲精品中文字幕久久久久 | 天天躁夜夜躁狠狠是什么心态 | 在线成人www免费观看视频 | 免费国产成人高清在线观看网站 | 2020久久超碰国产精品最新 | 亚洲色欲久久久综合网东京热 | 国产极品美女高潮无套在线观看 | 婷婷六月久久综合丁香 | 欧美日韩亚洲国产精品 | 亚洲精品成人福利网站 | 日韩精品无码一区二区中文字幕 | 99er热精品视频 | 亚洲人亚洲人成电影网站色 | 久久久久久久人妻无码中文字幕爆 | 午夜福利一区二区三区在线观看 | 亚洲国精产品一二二线 | 牛和人交xxxx欧美 | 久久久久久久久蜜桃 | 激情亚洲一区国产精品 | 99精品无人区乱码1区2区3区 | 久激情内射婷内射蜜桃人妖 | 88国产精品欧美一区二区三区 | 亚洲精品一区三区三区在线观看 | 九九在线中文字幕无码 | 成年美女黄网站色大免费视频 | 九月婷婷人人澡人人添人人爽 | 成熟女人特级毛片www免费 | 精品国产av色一区二区深夜久久 | 国产猛烈高潮尖叫视频免费 | 男女爱爱好爽视频免费看 | 日韩精品一区二区av在线 | 波多野42部无码喷潮在线 | 久久精品人人做人人综合试看 | 久久久久久久女国产乱让韩 | 白嫩日本少妇做爰 | 国产熟妇高潮叫床视频播放 | 亚洲狠狠婷婷综合久久 | 综合人妻久久一区二区精品 | 久久精品国产一区二区三区肥胖 | 一个人看的www免费视频在线观看 | 国产成人午夜福利在线播放 | 99久久99久久免费精品蜜桃 | 伊在人天堂亚洲香蕉精品区 | 精品无码国产自产拍在线观看蜜 | 亚洲综合无码一区二区三区 | 双乳奶水饱满少妇呻吟 | 成人无码精品一区二区三区 | 日韩av激情在线观看 | 97久久精品无码一区二区 | 无码国产激情在线观看 | 日本一卡二卡不卡视频查询 | 日韩少妇内射免费播放 | 国产一区二区三区影院 | 人妻无码久久精品人妻 | 欧美zoozzooz性欧美 | 大乳丰满人妻中文字幕日本 | 日韩精品一区二区av在线 | 性欧美大战久久久久久久 | 少妇性l交大片欧洲热妇乱xxx | 午夜成人1000部免费视频 | 久久综合九色综合97网 | 中文字幕 亚洲精品 第1页 | 2020久久超碰国产精品最新 | 久久久国产一区二区三区 | 久久久久久久女国产乱让韩 | 精品久久久无码中文字幕 | 色婷婷综合中文久久一本 | 少妇无码吹潮 | 成人欧美一区二区三区黑人免费 | 久久亚洲日韩精品一区二区三区 | 成人无码视频免费播放 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国内丰满熟女出轨videos | 天天拍夜夜添久久精品大 | yw尤物av无码国产在线观看 | 国产精品福利视频导航 | 麻豆av传媒蜜桃天美传媒 | 男人扒开女人内裤强吻桶进去 | 国产精品99久久精品爆乳 | 久久精品国产一区二区三区肥胖 | 男女下面进入的视频免费午夜 | 久久精品人人做人人综合 | 亚洲一区av无码专区在线观看 | 日本乱人伦片中文三区 | 国产精品高潮呻吟av久久 | 露脸叫床粗话东北少妇 | 天天摸天天透天天添 | 十八禁真人啪啪免费网站 | 九九热爱视频精品 | 四虎永久在线精品免费网址 | 欧美 丝袜 自拍 制服 另类 | 午夜福利不卡在线视频 | 亚洲色偷偷男人的天堂 | 2019nv天堂香蕉在线观看 | 丰满岳乱妇在线观看中字无码 | 人人妻人人藻人人爽欧美一区 | 亚洲国产高清在线观看视频 | 久久国产精品偷任你爽任你 | 中文字幕亚洲情99在线 | 88国产精品欧美一区二区三区 | 亚洲中文字幕无码中文字在线 | 久久国产精品偷任你爽任你 | 2019nv天堂香蕉在线观看 | 免费网站看v片在线18禁无码 | 国产亚洲精品久久久闺蜜 | 无遮无挡爽爽免费视频 | 久久久久成人片免费观看蜜芽 | 久久久久人妻一区精品色欧美 | 国产精品内射视频免费 | 国产三级久久久精品麻豆三级 | 中文字幕乱码人妻二区三区 | 欧美真人作爱免费视频 | 亚洲精品久久久久久久久久久 | 青青青爽视频在线观看 | 久久精品无码一区二区三区 | 国产成人无码av在线影院 | 天堂一区人妻无码 | 亚洲中文字幕成人无码 | 久久久av男人的天堂 | 国产猛烈高潮尖叫视频免费 | 亚洲精品中文字幕久久久久 | 国产麻豆精品精东影业av网站 | 女高中生第一次破苞av | 亚洲色www成人永久网址 | 成人女人看片免费视频放人 | 免费无码的av片在线观看 | 狠狠色噜噜狠狠狠狠7777米奇 | 欧美日韩一区二区综合 | 日本大乳高潮视频在线观看 | 大色综合色综合网站 | 西西人体www44rt大胆高清 | 亚洲精品久久久久久一区二区 | 乱中年女人伦av三区 | 国产午夜亚洲精品不卡下载 | 国产精品沙发午睡系列 | 精品亚洲韩国一区二区三区 | 人妻少妇精品无码专区动漫 | 精品一区二区三区波多野结衣 | 久久久久久国产精品无码下载 | 九九久久精品国产免费看小说 | 扒开双腿吃奶呻吟做受视频 | 久久 国产 尿 小便 嘘嘘 | 全黄性性激高免费视频 | 国产激情综合五月久久 | 丰满肥臀大屁股熟妇激情视频 | 欧美 日韩 人妻 高清 中文 | 成人影院yy111111在线观看 | 久久国内精品自在自线 | 日韩精品成人一区二区三区 | 亚洲 a v无 码免 费 成 人 a v | 伊人久久大香线焦av综合影院 | 麻豆国产人妻欲求不满谁演的 | 爆乳一区二区三区无码 | 成人一区二区免费视频 | 精品亚洲韩国一区二区三区 | 玩弄少妇高潮ⅹxxxyw | 日欧一片内射va在线影院 | 精品厕所偷拍各类美女tp嘘嘘 | 日本熟妇大屁股人妻 | 动漫av网站免费观看 | 无码一区二区三区在线 | 国产成人综合在线女婷五月99播放 | 最新版天堂资源中文官网 | 亚洲热妇无码av在线播放 | 国产乱码精品一品二品 | 国产一区二区三区精品视频 | 亚洲 激情 小说 另类 欧美 | 97精品国产97久久久久久免费 | 给我免费的视频在线观看 | 欧美丰满老熟妇xxxxx性 | 粗大的内捧猛烈进出视频 | 久久精品一区二区三区四区 | 亚洲综合在线一区二区三区 | av在线亚洲欧洲日产一区二区 | 又大又黄又粗又爽的免费视频 | 国产卡一卡二卡三 | 久久精品视频在线看15 | 东京热男人av天堂 | 无码人中文字幕 | 中文字幕无码日韩欧毛 | 国产亚洲欧美日韩亚洲中文色 | 免费观看黄网站 | 一本大道伊人av久久综合 | 少妇人妻大乳在线视频 | 亚洲 欧美 激情 小说 另类 | 天天躁日日躁狠狠躁免费麻豆 | 99精品视频在线观看免费 | 婷婷五月综合激情中文字幕 | 久久国语露脸国产精品电影 | 国产精品久久久午夜夜伦鲁鲁 | 国产肉丝袜在线观看 | 狠狠色欧美亚洲狠狠色www | 性做久久久久久久久 | 久久99精品久久久久久动态图 | 国产特级毛片aaaaaa高潮流水 | 少妇无码一区二区二三区 | 人人爽人人澡人人高潮 | 中文精品久久久久人妻不卡 | 亚洲自偷自拍另类第1页 | 中文字幕日产无线码一区 | 国产亚洲精品久久久闺蜜 | 久久久久久av无码免费看大片 | 国产片av国语在线观看 | 最新国产麻豆aⅴ精品无码 | 性欧美牲交xxxxx视频 | 蜜桃av抽搐高潮一区二区 | 欧美日韩色另类综合 | 国产午夜精品一区二区三区嫩草 | 国产精品久久久一区二区三区 | 亚洲国产欧美国产综合一区 | 成人无码精品1区2区3区免费看 | 国産精品久久久久久久 | 国产精品99久久精品爆乳 | 亚洲s色大片在线观看 | 女人被爽到呻吟gif动态图视看 | 国精产品一品二品国精品69xx | 女高中生第一次破苞av | 2019午夜福利不卡片在线 | 国产无遮挡吃胸膜奶免费看 | 国产做国产爱免费视频 | 曰本女人与公拘交酡免费视频 | 精品成在人线av无码免费看 | 十八禁真人啪啪免费网站 | 野外少妇愉情中文字幕 | 色一情一乱一伦一视频免费看 | 亲嘴扒胸摸屁股激烈网站 | 欧美国产日产一区二区 | 久久婷婷五月综合色国产香蕉 | 久久亚洲中文字幕精品一区 | 精品国产精品久久一区免费式 | 国产疯狂伦交大片 | 日本xxxx色视频在线观看免费 | 国产人成高清在线视频99最全资源 | 无码人妻精品一区二区三区下载 | 国产成人无码av片在线观看不卡 | 国产亚洲精品久久久久久久久动漫 | 国内精品人妻无码久久久影院 | 婷婷五月综合激情中文字幕 | 天天做天天爱天天爽综合网 | 色综合久久久无码网中文 | 福利一区二区三区视频在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲欧洲日本综合aⅴ在线 | 中文字幕无码免费久久9一区9 | 青青草原综合久久大伊人精品 | 久精品国产欧美亚洲色aⅴ大片 | 久久综合色之久久综合 | 最新国产乱人伦偷精品免费网站 | 精品厕所偷拍各类美女tp嘘嘘 | 国内精品久久久久久中文字幕 | 国产激情一区二区三区 | 欧美阿v高清资源不卡在线播放 | 国产香蕉97碰碰久久人人 | 两性色午夜免费视频 | 人妻尝试又大又粗久久 | 国产精品高潮呻吟av久久4虎 | 1000部夫妻午夜免费 | 欧美国产日韩久久mv | 免费无码的av片在线观看 | 少妇被粗大的猛进出69影院 | 精品国产一区av天美传媒 | 又大又硬又爽免费视频 | 夜夜影院未满十八勿进 | 伊人久久大香线蕉av一区二区 | 丰满诱人的人妻3 | 国产情侣作爱视频免费观看 | 欧洲美熟女乱又伦 | 久久99精品久久久久久动态图 | 国产色在线 | 国产 | 日本熟妇乱子伦xxxx | 国内精品人妻无码久久久影院蜜桃 | 欧美丰满少妇xxxx性 | 久久99久久99精品中文字幕 | 亚洲人成影院在线无码按摩店 | 色欲综合久久中文字幕网 | 丝袜足控一区二区三区 | 日日橹狠狠爱欧美视频 | 少妇人妻大乳在线视频 | 正在播放老肥熟妇露脸 | 又大又紧又粉嫩18p少妇 | 中文字幕精品av一区二区五区 | 麻豆国产人妻欲求不满谁演的 | 色综合久久久久综合一本到桃花网 | 亚洲色无码一区二区三区 | 377p欧洲日本亚洲大胆 | 日韩成人一区二区三区在线观看 | 国产又粗又硬又大爽黄老大爷视 | 又粗又大又硬又长又爽 | 日韩精品久久久肉伦网站 | 精品乱码久久久久久久 | 亚洲区欧美区综合区自拍区 | 色诱久久久久综合网ywww | 全黄性性激高免费视频 | 男人和女人高潮免费网站 | 国产精品第一国产精品 | 无码福利日韩神码福利片 | 久久亚洲精品成人无码 | 国产又爽又猛又粗的视频a片 | 欧美日韩视频无码一区二区三 | 久久亚洲中文字幕精品一区 | 中文毛片无遮挡高清免费 | 久久久中文久久久无码 | 狠狠色丁香久久婷婷综合五月 | 丰满少妇女裸体bbw | 国内丰满熟女出轨videos | 免费看男女做好爽好硬视频 | 亚洲国产一区二区三区在线观看 | 午夜无码人妻av大片色欲 | 午夜肉伦伦影院 | 波多野结衣av在线观看 | 99久久99久久免费精品蜜桃 | 伦伦影院午夜理论片 | 久久国产自偷自偷免费一区调 | 成 人影片 免费观看 | 亚洲欧美综合区丁香五月小说 | 国模大胆一区二区三区 | 欧洲极品少妇 | 午夜时刻免费入口 | 精品人妻人人做人人爽夜夜爽 | 性欧美熟妇videofreesex | 日韩精品无码免费一区二区三区 | 亚洲国产精品成人久久蜜臀 | √8天堂资源地址中文在线 | 国产亚洲精品久久久ai换 | 无码精品人妻一区二区三区av | 亚洲熟妇色xxxxx欧美老妇y | 极品尤物被啪到呻吟喷水 | 99久久精品国产一区二区蜜芽 | 又粗又大又硬毛片免费看 | 久久精品国产99久久6动漫 | 天堂无码人妻精品一区二区三区 | 18无码粉嫩小泬无套在线观看 | 国模大胆一区二区三区 | 国产精品亚洲专区无码不卡 | 美女扒开屁股让男人桶 | 欧美激情综合亚洲一二区 | 高清无码午夜福利视频 | 婷婷五月综合激情中文字幕 | 丰满诱人的人妻3 | 成在人线av无码免费 | 亚洲精品午夜国产va久久成人 | 波多野结衣乳巨码无在线观看 | 国产精品亚洲一区二区三区喷水 | 亚洲日本va中文字幕 | 7777奇米四色成人眼影 | 狠狠综合久久久久综合网 | 亚洲乱码日产精品bd | 久久99国产综合精品 | 欧美xxxxx精品 | 好爽又高潮了毛片免费下载 | 又黄又爽又色的视频 | 人人妻人人澡人人爽精品欧美 | 狠狠色丁香久久婷婷综合五月 | 成 人 免费观看网站 | 国产猛烈高潮尖叫视频免费 | 99精品国产综合久久久久五月天 | 十八禁真人啪啪免费网站 | 国产激情精品一区二区三区 | 国产福利视频一区二区 | 国产成人无码a区在线观看视频app | 国产人妻精品一区二区三区 | 亚洲国产av精品一区二区蜜芽 | 亚洲国产精品久久久久久 | 精品国产精品久久一区免费式 | 1000部啪啪未满十八勿入下载 | 亚洲国产av美女网站 | 亚洲精品欧美二区三区中文字幕 | 国产卡一卡二卡三 | 国产亚洲精品精品国产亚洲综合 | 亚洲一区二区三区在线观看网站 | 国产97在线 | 亚洲 | 国产99久久精品一区二区 | 少妇厨房愉情理9仑片视频 | 国产超级va在线观看视频 | 欧美成人高清在线播放 | www国产精品内射老师 | 国产网红无码精品视频 | 亚洲中文字幕在线观看 | 亚洲综合伊人久久大杳蕉 | 亚洲va中文字幕无码久久不卡 | 中文字幕色婷婷在线视频 | 啦啦啦www在线观看免费视频 | 最新国产乱人伦偷精品免费网站 | 婷婷综合久久中文字幕蜜桃三电影 | 无码国模国产在线观看 | 人妻少妇精品无码专区动漫 | 欧美大屁股xxxxhd黑色 | 无人区乱码一区二区三区 | 国产免费久久久久久无码 | 澳门永久av免费网站 | 国产va免费精品观看 | 免费看男女做好爽好硬视频 | 亚洲成av人片天堂网无码】 | 欧美三级不卡在线观看 | 中文精品无码中文字幕无码专区 | 鲁大师影院在线观看 | 狠狠cao日日穞夜夜穞av | 99精品无人区乱码1区2区3区 | 成人试看120秒体验区 | 图片小说视频一区二区 | 久久午夜无码鲁丝片秋霞 | 久久精品国产一区二区三区肥胖 | 亚洲乱码日产精品bd | 四虎国产精品一区二区 | 精品久久久中文字幕人妻 | 国产三级精品三级男人的天堂 | 真人与拘做受免费视频 | 国产无遮挡又黄又爽又色 | 亚洲天堂2017无码中文 | 日本一本二本三区免费 | 亚洲日韩av片在线观看 | 国产精品丝袜黑色高跟鞋 | 国产精品无码成人午夜电影 | 国产网红无码精品视频 | 成年美女黄网站色大免费视频 | av无码久久久久不卡免费网站 | 国产无av码在线观看 | 精品无码一区二区三区的天堂 | 色婷婷综合激情综在线播放 | 国产色视频一区二区三区 | 成人精品视频一区二区 | 又大又硬又爽免费视频 | 国产综合在线观看 | www国产亚洲精品久久久日本 | 300部国产真实乱 | 精品偷自拍另类在线观看 | 三级4级全黄60分钟 | 少妇性俱乐部纵欲狂欢电影 | 东京热无码av男人的天堂 | 国产熟女一区二区三区四区五区 | 欧美色就是色 | 水蜜桃av无码 | 亚洲精品午夜无码电影网 | 国产性生交xxxxx无码 | 暴力强奷在线播放无码 | 久久午夜夜伦鲁鲁片无码免费 | 大肉大捧一进一出视频出来呀 | 色老头在线一区二区三区 | 99久久精品午夜一区二区 | 国产成人av免费观看 | 日韩人妻无码一区二区三区久久99 | 精品一二三区久久aaa片 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 乱码av麻豆丝袜熟女系列 | 粗大的内捧猛烈进出视频 | 极品尤物被啪到呻吟喷水 | 久久综合网欧美色妞网 | 精品无码国产一区二区三区av | 欧洲精品码一区二区三区免费看 | 欧美激情综合亚洲一二区 | 国产亲子乱弄免费视频 | 国产亚洲精品精品国产亚洲综合 | 天天摸天天透天天添 | 55夜色66夜色国产精品视频 | 无套内射视频囯产 | 欧美日本精品一区二区三区 | 又紧又大又爽精品一区二区 | aⅴ在线视频男人的天堂 | 欧美刺激性大交 | 亚洲国产午夜精品理论片 | 中文字幕无码热在线视频 | 色诱久久久久综合网ywww | 国产亚洲精品久久久久久久 | 亚洲国产日韩a在线播放 | 少妇无码吹潮 | 国内老熟妇对白xxxxhd | 久久久中文字幕日本无吗 | 亚洲熟妇色xxxxx欧美老妇y | 国产乱人伦av在线无码 | 精品久久综合1区2区3区激情 | 久久99国产综合精品 | 色五月丁香五月综合五月 | 爆乳一区二区三区无码 | 亚洲一区二区三区偷拍女厕 | 久久久中文字幕日本无吗 | 国产va免费精品观看 | 精品亚洲成av人在线观看 | 国产精品久久久久9999小说 | 国产婷婷色一区二区三区在线 | 中文字幕av日韩精品一区二区 | 强开小婷嫩苞又嫩又紧视频 | 无遮无挡爽爽免费视频 | 欧美日韩一区二区免费视频 | 午夜性刺激在线视频免费 | 国产精品无码成人午夜电影 | 樱花草在线播放免费中文 | 最新版天堂资源中文官网 | 18无码粉嫩小泬无套在线观看 | 俺去俺来也www色官网 | 亚洲日本一区二区三区在线 | 免费无码午夜福利片69 | ass日本丰满熟妇pics | 亚洲中文字幕在线无码一区二区 | 欧美人与善在线com | 日本护士xxxxhd少妇 | 亚洲精品一区二区三区在线观看 | 一区二区传媒有限公司 | 野狼第一精品社区 | 久久精品女人的天堂av | 久久久成人毛片无码 | 中文字幕日产无线码一区 | 99国产精品白浆在线观看免费 | 少妇性俱乐部纵欲狂欢电影 | 国产精品久久久久无码av色戒 | 天堂亚洲2017在线观看 | 国产午夜无码视频在线观看 | 国内老熟妇对白xxxxhd | a在线亚洲男人的天堂 | 午夜男女很黄的视频 | 东京一本一道一二三区 | 少妇的肉体aa片免费 | 人人妻在人人 | 一本一道久久综合久久 | 久久亚洲精品成人无码 | 久久精品国产日本波多野结衣 | www国产精品内射老师 | 日本爽爽爽爽爽爽在线观看免 | 日本熟妇浓毛 | 永久免费观看美女裸体的网站 | 婷婷综合久久中文字幕蜜桃三电影 | 久久99精品久久久久久动态图 | ass日本丰满熟妇pics | 久久 国产 尿 小便 嘘嘘 | 美女毛片一区二区三区四区 | 激情人妻另类人妻伦 | 动漫av网站免费观看 | 人妻夜夜爽天天爽三区 | 人妻少妇精品无码专区动漫 | 日本熟妇大屁股人妻 | 日韩人妻少妇一区二区三区 | 国产人妖乱国产精品人妖 | 7777奇米四色成人眼影 | 国产极品美女高潮无套在线观看 | 国产乱人伦av在线无码 | 日韩欧美群交p片內射中文 | 爱做久久久久久 | 人妻无码αv中文字幕久久琪琪布 | 亚洲 欧美 激情 小说 另类 | 久久zyz资源站无码中文动漫 | 国产成人午夜福利在线播放 | 日本饥渴人妻欲求不满 | 久久久久久亚洲精品a片成人 | 国产精品鲁鲁鲁 | 国产性生大片免费观看性 | 无码免费一区二区三区 | 欧美阿v高清资源不卡在线播放 | 在线看片无码永久免费视频 | 人人澡人人妻人人爽人人蜜桃 | 国产无遮挡吃胸膜奶免费看 | 精品国产av色一区二区深夜久久 | 秋霞成人午夜鲁丝一区二区三区 | 国产成人人人97超碰超爽8 | 国产亚洲精品精品国产亚洲综合 | 婷婷五月综合激情中文字幕 | 美女张开腿让人桶 | 成人综合网亚洲伊人 | 日韩少妇内射免费播放 | 亚洲精品午夜国产va久久成人 | 大地资源中文第3页 | 在线亚洲高清揄拍自拍一品区 | 无码人妻丰满熟妇区毛片18 | 一个人看的www免费视频在线观看 | 成人免费视频一区二区 | 国产精品免费大片 | 奇米影视7777久久精品 | 好屌草这里只有精品 | 久久精品中文闷骚内射 | 国产av一区二区精品久久凹凸 | 欧美野外疯狂做受xxxx高潮 | 国内少妇偷人精品视频免费 | 丰满人妻一区二区三区免费视频 | 思思久久99热只有频精品66 | 日本va欧美va欧美va精品 | 色狠狠av一区二区三区 | 一本久道高清无码视频 | 老太婆性杂交欧美肥老太 | 亚洲熟悉妇女xxx妇女av | 日本精品少妇一区二区三区 | 综合网日日天干夜夜久久 | 蜜桃视频插满18在线观看 | 性欧美熟妇videofreesex | 国产精品久久久久影院嫩草 | 亚洲国产高清在线观看视频 | 国产午夜无码精品免费看 | 免费国产黄网站在线观看 | 夜夜高潮次次欢爽av女 | 亚洲精品午夜国产va久久成人 | 男女性色大片免费网站 | 红桃av一区二区三区在线无码av | 国产亚av手机在线观看 | 国产精品美女久久久网av | 无码av最新清无码专区吞精 | 国精品人妻无码一区二区三区蜜柚 | 青青青手机频在线观看 | 精品国产一区二区三区av 性色 | 久久久国产精品无码免费专区 | 午夜免费福利小电影 | 人妻体内射精一区二区三四 | 成人aaa片一区国产精品 | 秋霞成人午夜鲁丝一区二区三区 | 午夜精品一区二区三区的区别 | 中文字幕无码乱人伦 | 少妇高潮一区二区三区99 | 久久精品女人的天堂av | 国产精品高潮呻吟av久久4虎 | 日本精品高清一区二区 | 99在线 | 亚洲 | 久久午夜无码鲁丝片秋霞 | 欧美日韩一区二区综合 | 成人欧美一区二区三区黑人免费 | 98国产精品综合一区二区三区 | aⅴ在线视频男人的天堂 | 久久午夜无码鲁丝片 | 伊人久久大香线蕉av一区二区 | 性欧美牲交xxxxx视频 | 亚洲乱亚洲乱妇50p | 免费国产成人高清在线观看网站 | 国产一区二区三区影院 | 欧美熟妇另类久久久久久多毛 | 日日碰狠狠丁香久燥 | 中文字幕无码av激情不卡 | 欧美成人家庭影院 | 国产精品高潮呻吟av久久 | 日韩 欧美 动漫 国产 制服 | 桃花色综合影院 | 精品偷拍一区二区三区在线看 | 国产真实夫妇视频 | 亚洲の无码国产の无码步美 | 国产成人综合美国十次 | 欧美性生交xxxxx久久久 | 丰满少妇熟乱xxxxx视频 | 国产欧美精品一区二区三区 | 国产免费无码一区二区视频 | 欧美人与物videos另类 | 国产va免费精品观看 | 亚洲色在线无码国产精品不卡 | 久久国产精品萌白酱免费 | 国产精品第一国产精品 | 精品亚洲成av人在线观看 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产一区二区三区四区五区加勒比 | 88国产精品欧美一区二区三区 | 午夜性刺激在线视频免费 | 性欧美牲交xxxxx视频 | 内射爽无广熟女亚洲 | 99久久精品日本一区二区免费 | 成人无码精品1区2区3区免费看 | 国产片av国语在线观看 | 狠狠色丁香久久婷婷综合五月 | 国产亚洲精品精品国产亚洲综合 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 一本久久伊人热热精品中文字幕 | 国产精品高潮呻吟av久久4虎 | 久久久www成人免费毛片 | 国产精品人人妻人人爽 | 少女韩国电视剧在线观看完整 | 亚洲成av人在线观看网址 | 日本免费一区二区三区最新 | 午夜熟女插插xx免费视频 | 日本又色又爽又黄的a片18禁 | 国产成人精品久久亚洲高清不卡 | 亲嘴扒胸摸屁股激烈网站 | 香港三级日本三级妇三级 | 亚洲 a v无 码免 费 成 人 a v | 300部国产真实乱 | 精品夜夜澡人妻无码av蜜桃 | 黄网在线观看免费网站 | 东北女人啪啪对白 | 综合激情五月综合激情五月激情1 | 兔费看少妇性l交大片免费 | 国产人妻精品一区二区三区 | 波多野42部无码喷潮在线 | 国产午夜亚洲精品不卡下载 | 国产口爆吞精在线视频 | 四虎永久在线精品免费网址 | а√资源新版在线天堂 | 一本久久伊人热热精品中文字幕 | 内射白嫩少妇超碰 | 四虎国产精品一区二区 | 久久精品国产99久久6动漫 | yw尤物av无码国产在线观看 | 黑人玩弄人妻中文在线 | 亚洲精品久久久久中文第一幕 | 久久精品国产大片免费观看 | 亚洲欧美国产精品久久 | 亚洲国产成人av在线观看 | 18无码粉嫩小泬无套在线观看 | 成人毛片一区二区 | 国产成人综合色在线观看网站 | 亚洲 a v无 码免 费 成 人 a v | 日日碰狠狠躁久久躁蜜桃 | 日韩少妇白浆无码系列 | 亚洲天堂2017无码中文 | 中文字幕亚洲情99在线 | 娇妻被黑人粗大高潮白浆 | 黑人巨大精品欧美黑寡妇 | 成人无码影片精品久久久 | 成人精品视频一区二区三区尤物 | 97色伦图片97综合影院 | 午夜精品久久久内射近拍高清 | 性做久久久久久久久 | 精品国产一区二区三区四区 | 国产9 9在线 | 中文 | 色婷婷综合中文久久一本 | 亚洲熟女一区二区三区 | 欧美熟妇另类久久久久久多毛 | 国产另类ts人妖一区二区 | 国产亚洲精品精品国产亚洲综合 | 国产无av码在线观看 | 亚洲综合精品香蕉久久网 | 99久久精品国产一区二区蜜芽 | 亚洲熟妇色xxxxx欧美老妇 | 亚洲综合伊人久久大杳蕉 | 性做久久久久久久免费看 | 亚洲国产综合无码一区 | 国产精品久久久 | 300部国产真实乱 | 少妇无码吹潮 | 波多野结衣一区二区三区av免费 | 国产欧美精品一区二区三区 | 国产精品鲁鲁鲁 | 亚洲爆乳无码专区 | 久久精品99久久香蕉国产色戒 | 一本色道久久综合狠狠躁 | 色欲人妻aaaaaaa无码 | 日本精品高清一区二区 | 97se亚洲精品一区 | 一本久道高清无码视频 | 国产亚洲精品久久久闺蜜 | 亚洲国精产品一二二线 | 亚洲国产精品无码久久久久高潮 | 99视频精品全部免费免费观看 | 波多野结衣av一区二区全免费观看 | 无码成人精品区在线观看 | 国内精品九九久久久精品 | 国产人妻精品一区二区三区 | 成在人线av无码免观看麻豆 | 免费男性肉肉影院 | 国产激情无码一区二区 | a片免费视频在线观看 | 亚洲一区av无码专区在线观看 | 亚洲色在线无码国产精品不卡 | 无码免费一区二区三区 | 日韩av无码一区二区三区不卡 | 精品夜夜澡人妻无码av蜜桃 | 国产农村妇女高潮大叫 | 丝袜 中出 制服 人妻 美腿 | 精品偷自拍另类在线观看 | 欧美35页视频在线观看 | 精品久久久无码人妻字幂 | 精品久久久无码人妻字幂 | 黑人巨大精品欧美黑寡妇 | 亚洲精品无码国产 | 国产激情综合五月久久 | 欧美激情综合亚洲一二区 | 又色又爽又黄的美女裸体网站 | 亚洲一区二区三区在线观看网站 | 亚洲自偷精品视频自拍 | 国产精品欧美成人 | 国产亚洲人成a在线v网站 | 少妇无码一区二区二三区 | 久久久久久久女国产乱让韩 | 亚洲熟妇色xxxxx欧美老妇 | 妺妺窝人体色www婷婷 | 亚洲日韩av一区二区三区四区 | 中文字幕精品av一区二区五区 | 一区二区传媒有限公司 | 永久免费观看美女裸体的网站 | 亚洲一区二区三区国产精华液 | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲欧美日韩成人高清在线一区 | 精品夜夜澡人妻无码av蜜桃 | 天天做天天爱天天爽综合网 | 色一情一乱一伦一视频免费看 | 欧美熟妇另类久久久久久多毛 | 一区二区三区高清视频一 | 日日天干夜夜狠狠爱 | 中文字幕中文有码在线 | 精品成在人线av无码免费看 | 天堂一区人妻无码 | 天堂亚洲免费视频 | 国产超级va在线观看视频 | 精品国精品国产自在久国产87 | 任你躁国产自任一区二区三区 | 少妇无码av无码专区在线观看 | 无码av中文字幕免费放 | 色综合久久88色综合天天 | 丰满少妇弄高潮了www | 国产午夜无码视频在线观看 | 精品少妇爆乳无码av无码专区 | 成人性做爰aaa片免费看不忠 | 无码毛片视频一区二区本码 | 久久国产精品二国产精品 | 人人澡人人妻人人爽人人蜜桃 | 国产黄在线观看免费观看不卡 | 麻豆av传媒蜜桃天美传媒 | 亚洲精品欧美二区三区中文字幕 | 全球成人中文在线 | 玩弄人妻少妇500系列视频 | 荫蒂被男人添的好舒服爽免费视频 | 色婷婷av一区二区三区之红樱桃 | 无码国产乱人伦偷精品视频 | 精品无码国产自产拍在线观看蜜 | 天天拍夜夜添久久精品大 | 搡女人真爽免费视频大全 | 97精品国产97久久久久久免费 | 久久久久se色偷偷亚洲精品av | 伊人久久婷婷五月综合97色 | 国产精品亚洲专区无码不卡 | 精品偷拍一区二区三区在线看 | 成人免费视频在线观看 | 蜜桃无码一区二区三区 | 成人精品视频一区二区 | 成 人影片 免费观看 | 免费国产成人高清在线观看网站 | 性色av无码免费一区二区三区 | 国产精品理论片在线观看 | 成在人线av无码免费 | 亚洲乱码中文字幕在线 | 亚洲国产精品一区二区美利坚 | 爆乳一区二区三区无码 | 一本色道久久综合狠狠躁 | 国产一精品一av一免费 | 国内综合精品午夜久久资源 | 九九久久精品国产免费看小说 | 99国产欧美久久久精品 | 成人欧美一区二区三区黑人 | 国产在线精品一区二区高清不卡 | 欧美日韩视频无码一区二区三 | 久久婷婷五月综合色国产香蕉 | 自拍偷自拍亚洲精品被多人伦好爽 | 牲欲强的熟妇农村老妇女 | 国产精品鲁鲁鲁 | 成人三级无码视频在线观看 | 色婷婷综合激情综在线播放 | 天堂а√在线中文在线 | 熟妇女人妻丰满少妇中文字幕 | 18禁止看的免费污网站 | 欧美日本日韩 | 久久午夜无码鲁丝片午夜精品 | 十八禁视频网站在线观看 | 精品国产一区二区三区av 性色 | 久久综合九色综合欧美狠狠 | 免费中文字幕日韩欧美 | 在线亚洲高清揄拍自拍一品区 | 国产精品人人爽人人做我的可爱 | 国产午夜视频在线观看 | 伊人久久大香线蕉av一区二区 | 亚洲最大成人网站 | 亚洲娇小与黑人巨大交 | 人妻少妇精品无码专区动漫 | 兔费看少妇性l交大片免费 | 亚洲精品成人av在线 | 精品国偷自产在线视频 | 亚洲国产精品无码久久久久高潮 | 午夜福利一区二区三区在线观看 | 一本精品99久久精品77 | 国语自产偷拍精品视频偷 | 国产一精品一av一免费 | 人妻体内射精一区二区三四 | 人人妻人人澡人人爽人人精品浪潮 | 国产一区二区三区四区五区加勒比 | 成熟女人特级毛片www免费 | 欧美日本免费一区二区三区 | 亚洲综合精品香蕉久久网 | 俺去俺来也在线www色官网 | 中国大陆精品视频xxxx | 成熟女人特级毛片www免费 | 色窝窝无码一区二区三区色欲 | 国产肉丝袜在线观看 | 男女作爱免费网站 | а√天堂www在线天堂小说 | 亚洲欧美国产精品专区久久 | 无码人妻丰满熟妇区毛片18 | 亚洲国产精品久久人人爱 | 色偷偷人人澡人人爽人人模 | 中文字幕av无码一区二区三区电影 | 日本熟妇人妻xxxxx人hd | 曰韩无码二三区中文字幕 | 99国产精品白浆在线观看免费 | 7777奇米四色成人眼影 | 国产在线精品一区二区高清不卡 | 色一情一乱一伦一视频免费看 | 免费国产成人高清在线观看网站 | 无码国内精品人妻少妇 | 中文字幕乱码中文乱码51精品 | 人人妻在人人 | 黑人玩弄人妻中文在线 | 久久国语露脸国产精品电影 | 中文字幕无码免费久久9一区9 | 国产人妻精品一区二区三区 | 少妇性荡欲午夜性开放视频剧场 | 亚洲精品中文字幕乱码 | 日韩欧美中文字幕公布 | 午夜精品一区二区三区在线观看 | 偷窥日本少妇撒尿chinese | 狠狠综合久久久久综合网 | 天天做天天爱天天爽综合网 | 日韩精品无码一区二区中文字幕 | 女人被男人躁得好爽免费视频 | 色欲人妻aaaaaaa无码 | 精品国产一区二区三区四区 | 精品久久久久久亚洲精品 | 丰满护士巨好爽好大乳 | 午夜无码区在线观看 | 亚洲熟妇色xxxxx欧美老妇 | 亚洲成a人片在线观看无码3d | 国产小呦泬泬99精品 | 牛和人交xxxx欧美 | 国産精品久久久久久久 | 激情人妻另类人妻伦 | 久久久久免费精品国产 | 亚洲国产精品一区二区第一页 | 国产舌乚八伦偷品w中 | 日韩精品无码一区二区中文字幕 | 久青草影院在线观看国产 | 国产av久久久久精东av | 国产精品多人p群无码 | 欧美成人免费全部网站 | 亚洲日韩av片在线观看 | 粗大的内捧猛烈进出视频 | 亚洲成熟女人毛毛耸耸多 | 夜精品a片一区二区三区无码白浆 | 久久国内精品自在自线 | 国产精品办公室沙发 | 国产真实伦对白全集 | 一本色道久久综合狠狠躁 | 无码av最新清无码专区吞精 | 真人与拘做受免费视频一 | 草草网站影院白丝内射 | 国产猛烈高潮尖叫视频免费 | 99久久精品无码一区二区毛片 | 国产真实夫妇视频 | 国产特级毛片aaaaaaa高清 | 久久久久久久女国产乱让韩 | 欧美第一黄网免费网站 | 欧美性生交xxxxx久久久 | 99精品国产综合久久久久五月天 | 夜先锋av资源网站 | 国产麻豆精品精东影业av网站 | 狂野欧美性猛xxxx乱大交 | 国产精品igao视频网 | 性生交大片免费看l | 国产香蕉尹人综合在线观看 | 性色欲情网站iwww九文堂 | 丝袜人妻一区二区三区 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲欧洲中文日韩av乱码 | 欧美喷潮久久久xxxxx | 亚洲精品一区二区三区四区五区 | 国产精品久久久久影院嫩草 | 人妻体内射精一区二区三四 | 人妻中文无码久热丝袜 | www国产亚洲精品久久久日本 | 波多野结衣乳巨码无在线观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 欧美xxxxx精品 | 4hu四虎永久在线观看 | 在线а√天堂中文官网 | www国产亚洲精品久久久日本 | 久久国语露脸国产精品电影 | 国产又爽又猛又粗的视频a片 | 国产人妻大战黑人第1集 | 国产精品久久国产精品99 | 久久综合九色综合欧美狠狠 | 亚洲一区二区观看播放 | 永久黄网站色视频免费直播 | 免费网站看v片在线18禁无码 | 久久亚洲日韩精品一区二区三区 | 中文字幕日产无线码一区 | 熟女俱乐部五十路六十路av | 国产人妖乱国产精品人妖 | 欧美日韩视频无码一区二区三 | 亚洲日本va午夜在线电影 | 3d动漫精品啪啪一区二区中 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲一区二区三区四区 | 中国大陆精品视频xxxx | 人妻人人添人妻人人爱 | 99久久人妻精品免费二区 | 国产亚洲日韩欧美另类第八页 | 色综合久久久久综合一本到桃花网 | 人人澡人人透人人爽 | 无码国模国产在线观看 | 亚洲小说春色综合另类 | 中文字幕亚洲情99在线 | 午夜丰满少妇性开放视频 | 亚洲精品综合一区二区三区在线 | 熟妇女人妻丰满少妇中文字幕 | 无码成人精品区在线观看 | 日本又色又爽又黄的a片18禁 | v一区无码内射国产 | 少妇被粗大的猛进出69影院 | 色一情一乱一伦一区二区三欧美 | 牲欲强的熟妇农村老妇女视频 | 亚洲熟妇色xxxxx欧美老妇 | 亚洲日本在线电影 | 国产成人人人97超碰超爽8 | 无码人妻黑人中文字幕 | 久久精品99久久香蕉国产色戒 | 麻豆果冻传媒2021精品传媒一区下载 | 亚洲日本一区二区三区在线 | 国产亚洲日韩欧美另类第八页 | 少妇激情av一区二区 | 中文字幕乱码人妻二区三区 | 天下第一社区视频www日本 | 精品久久久久久亚洲精品 | 好屌草这里只有精品 | 2019nv天堂香蕉在线观看 | 麻豆精产国品 | 日本xxxx色视频在线观看免费 | 亚洲欧美日韩成人高清在线一区 | 国产欧美亚洲精品a | 在线成人www免费观看视频 | 精品乱码久久久久久久 | 欧美精品国产综合久久 | 大地资源中文第3页 | 午夜精品久久久久久久久 | 真人与拘做受免费视频 | 亚洲国产精品无码一区二区三区 | 成年美女黄网站色大免费全看 | 成人免费视频一区二区 | 日本www一道久久久免费榴莲 | 未满成年国产在线观看 | 精品一二三区久久aaa片 | 台湾无码一区二区 | 国产亚洲美女精品久久久2020 | 爆乳一区二区三区无码 | 亚洲综合久久一区二区 | 亚洲午夜久久久影院 | 丰满妇女强制高潮18xxxx | 国产精品无码一区二区桃花视频 | 嫩b人妻精品一区二区三区 | 国产精品久久久 | 日日摸日日碰夜夜爽av | 美女张开腿让人桶 | 国产片av国语在线观看 | 粗大的内捧猛烈进出视频 | 日本va欧美va欧美va精品 | 亚洲国产av美女网站 | 久久久精品456亚洲影院 | 人妻少妇被猛烈进入中文字幕 | 欧美性生交xxxxx久久久 | 欧美丰满熟妇xxxx性ppx人交 | 国产 浪潮av性色四虎 | 欧美第一黄网免费网站 | 国产精品久久久久久亚洲毛片 | 午夜精品久久久久久久 | 99久久人妻精品免费一区 | 天堂无码人妻精品一区二区三区 | 亚洲国产成人a精品不卡在线 | 日本爽爽爽爽爽爽在线观看免 | 精品国产青草久久久久福利 | a片免费视频在线观看 | 日产精品高潮呻吟av久久 | 人人妻人人澡人人爽欧美一区 | 99精品国产综合久久久久五月天 | 亚洲欧美国产精品久久 | 久久久精品456亚洲影院 | 精品国产一区二区三区四区 | 18无码粉嫩小泬无套在线观看 | 色综合久久久无码中文字幕 | 国产人成高清在线视频99最全资源 | 精品熟女少妇av免费观看 | 国产亚洲精品久久久久久久久动漫 | 欧美日本日韩 | 日日摸夜夜摸狠狠摸婷婷 | 免费人成在线观看网站 | 亚洲中文字幕无码一久久区 | 国产无套粉嫩白浆在线 | 日产精品99久久久久久 | 亚洲熟熟妇xxxx | 婷婷色婷婷开心五月四房播播 | 精品一区二区三区波多野结衣 | 正在播放东北夫妻内射 | 色欲人妻aaaaaaa无码 | 欧美国产日韩久久mv | 国产色视频一区二区三区 | 成人片黄网站色大片免费观看 | 国产成人一区二区三区别 | 欧美真人作爱免费视频 | 国内揄拍国内精品人妻 | 日本肉体xxxx裸交 | 国产成人精品久久亚洲高清不卡 | 国产亚洲精品久久久闺蜜 | 欧美亚洲日韩国产人成在线播放 | 中国女人内谢69xxxxxa片 | 97精品人妻一区二区三区香蕉 | 欧美成人高清在线播放 | 伊人久久婷婷五月综合97色 | 亚欧洲精品在线视频免费观看 | 日本爽爽爽爽爽爽在线观看免 | 激情五月综合色婷婷一区二区 | 一个人看的视频www在线 | 成人欧美一区二区三区 | 国产成人精品一区二区在线小狼 | 精品 日韩 国产 欧美 视频 | 亚洲热妇无码av在线播放 | 亚洲综合伊人久久大杳蕉 | 樱花草在线播放免费中文 | 色情久久久av熟女人妻网站 | 东京热男人av天堂 | 日本成熟视频免费视频 | 女人高潮内射99精品 | 婷婷丁香六月激情综合啪 | 国产小呦泬泬99精品 | 少妇愉情理伦片bd | 久久午夜无码鲁丝片秋霞 | 最近中文2019字幕第二页 | 一个人看的视频www在线 | 欧美怡红院免费全部视频 | 色综合久久久久综合一本到桃花网 | 免费中文字幕日韩欧美 | 夜夜高潮次次欢爽av女 | 精品久久久久香蕉网 | 久久久精品国产sm最大网站 | 小鲜肉自慰网站xnxx | 日本一本二本三区免费 | 国产精品美女久久久网av | 99久久婷婷国产综合精品青草免费 | 色诱久久久久综合网ywww | 亚洲色偷偷男人的天堂 | 日韩av无码中文无码电影 | 99精品久久毛片a片 | 无套内射视频囯产 | 97se亚洲精品一区 | 欧美自拍另类欧美综合图片区 | 国产精品人妻一区二区三区四 | 成人av无码一区二区三区 | 亚洲一区二区三区播放 | 久久久久免费看成人影片 | 国产内射老熟女aaaa | 我要看www免费看插插视频 | 亚洲欧美日韩综合久久久 | 中文毛片无遮挡高清免费 | 精品国产一区二区三区av 性色 | 双乳奶水饱满少妇呻吟 | 欧美日韩一区二区三区自拍 | 久久久中文字幕日本无吗 | 国产极品美女高潮无套在线观看 | 丝袜人妻一区二区三区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 一区二区三区高清视频一 | 国产肉丝袜在线观看 | 中国大陆精品视频xxxx | 亚洲国产精品久久人人爱 | 欧美老熟妇乱xxxxx | 2020久久香蕉国产线看观看 | 麻豆md0077饥渴少妇 | 午夜福利一区二区三区在线观看 | 欧美丰满熟妇xxxx | 麻豆果冻传媒2021精品传媒一区下载 | 久久视频在线观看精品 | 四虎国产精品免费久久 | 欧美丰满少妇xxxx性 | 人妻天天爽夜夜爽一区二区 | 欧美人与物videos另类 | 免费看少妇作爱视频 | 丰满人妻被黑人猛烈进入 | 亚洲欧美国产精品久久 | 色情久久久av熟女人妻网站 | 一本久道久久综合婷婷五月 | 5858s亚洲色大成网站www | 无码乱肉视频免费大全合集 | 国产绳艺sm调教室论坛 | 无码乱肉视频免费大全合集 | 人妻aⅴ无码一区二区三区 | 国产乱人无码伦av在线a | 亚洲国产精品久久久久久 | 精品久久久无码中文字幕 | 午夜男女很黄的视频 | 国产又爽又猛又粗的视频a片 | 国产成人午夜福利在线播放 | 狠狠cao日日穞夜夜穞av | 亚洲日韩一区二区三区 | 在线观看国产午夜福利片 | 国产特级毛片aaaaaa高潮流水 | 2020最新国产自产精品 | 国产真实乱对白精彩久久 | 九九综合va免费看 | 人妻中文无码久热丝袜 | 乌克兰少妇xxxx做受 | 欧美午夜特黄aaaaaa片 | 国产精品多人p群无码 | 午夜理论片yy44880影院 | 2019午夜福利不卡片在线 | 亚洲精品一区二区三区四区五区 | 国产精品无码久久av | 亚洲经典千人经典日产 | 中文字幕无码人妻少妇免费 | 国产精品无码成人午夜电影 | www成人国产高清内射 | 永久黄网站色视频免费直播 | 狂野欧美激情性xxxx | 国产精品无码永久免费888 | 黑人巨大精品欧美黑寡妇 | 欧美兽交xxxx×视频 | 亚洲国产精品无码久久久久高潮 | 欧美国产亚洲日韩在线二区 | 国产午夜无码精品免费看 | 国内揄拍国内精品人妻 | 天堂а√在线中文在线 | 久激情内射婷内射蜜桃人妖 | 99久久精品午夜一区二区 | 亚洲高清偷拍一区二区三区 | 亚洲国产精华液网站w | а√资源新版在线天堂 | 蜜桃av抽搐高潮一区二区 | 欧洲极品少妇 | 国产一区二区三区四区五区加勒比 | 国产一区二区三区精品视频 | 久久精品成人欧美大片 | 在线 国产 欧美 亚洲 天堂 | 精品成在人线av无码免费看 | 中文字幕无码av波多野吉衣 | ass日本丰满熟妇pics | 国产sm调教视频在线观看 | 欧美亚洲国产一区二区三区 | 久久国产精品偷任你爽任你 | 欧美激情一区二区三区成人 | 久久99精品久久久久久动态图 | 中文精品无码中文字幕无码专区 | 2020久久香蕉国产线看观看 | 亚洲乱码中文字幕在线 | 亚洲精品综合五月久久小说 | 伊人久久婷婷五月综合97色 | 亚洲欧洲中文日韩av乱码 | 久久久久亚洲精品男人的天堂 | 国产又爽又黄又刺激的视频 | 国产av无码专区亚洲a∨毛片 | 国产97人人超碰caoprom | 国产亚洲美女精品久久久2020 | 色窝窝无码一区二区三区色欲 | 亚洲成熟女人毛毛耸耸多 | 国产精品第一国产精品 | 成年美女黄网站色大免费全看 | 国产在线一区二区三区四区五区 | 麻豆国产丝袜白领秘书在线观看 | 中文无码精品a∨在线观看不卡 | 色欲av亚洲一区无码少妇 | 国产无遮挡又黄又爽免费视频 | 少妇高潮一区二区三区99 | 欧美三级不卡在线观看 | 欧美亚洲日韩国产人成在线播放 | 国产精品亚洲lv粉色 | 在线a亚洲视频播放在线观看 | 人人澡人摸人人添 | 成人一在线视频日韩国产 | 荫蒂被男人添的好舒服爽免费视频 | 久久久婷婷五月亚洲97号色 | 熟女体下毛毛黑森林 | 欧美成人午夜精品久久久 | 久久午夜夜伦鲁鲁片无码免费 | 中文毛片无遮挡高清免费 | 伊人久久大香线蕉av一区二区 | 久久国产精品偷任你爽任你 | 精品国产av色一区二区深夜久久 | 67194成是人免费无码 | 四虎影视成人永久免费观看视频 | 久久久国产一区二区三区 | 丝袜人妻一区二区三区 | 2020久久香蕉国产线看观看 | 欧美老妇交乱视频在线观看 | 成人欧美一区二区三区 | av在线亚洲欧洲日产一区二区 | 国产真实伦对白全集 | 人人澡人人透人人爽 | 在线a亚洲视频播放在线观看 | 无码人妻av免费一区二区三区 | 帮老师解开蕾丝奶罩吸乳网站 | 麻豆精品国产精华精华液好用吗 | 99久久人妻精品免费一区 | 精品人妻人人做人人爽夜夜爽 | 永久黄网站色视频免费直播 | 99在线 | 亚洲 | 亚洲狠狠婷婷综合久久 | 久久久久成人片免费观看蜜芽 | 亚洲精品一区二区三区在线观看 | a在线观看免费网站大全 | 日本xxxx色视频在线观看免费 | 国产精品久久久久9999小说 | 最新国产乱人伦偷精品免费网站 | 在线观看欧美一区二区三区 | 2020久久香蕉国产线看观看 | 精品久久久无码中文字幕 | 青青久在线视频免费观看 | 久久人人97超碰a片精品 | 丰满妇女强制高潮18xxxx | 久久精品女人天堂av免费观看 | 日日摸日日碰夜夜爽av | 久久99精品国产.久久久久 | 欧美熟妇另类久久久久久不卡 | 国产av久久久久精东av | 内射后入在线观看一区 | 亚洲无人区一区二区三区 | 久久97精品久久久久久久不卡 | 午夜不卡av免费 一本久久a久久精品vr综合 | 亚洲精品国偷拍自产在线麻豆 | 日韩精品无码一本二本三本色 | 少女韩国电视剧在线观看完整 | 高潮毛片无遮挡高清免费视频 | 日本一区二区更新不卡 | 无人区乱码一区二区三区 | 无码av岛国片在线播放 | 国产一区二区三区影院 | 日本精品久久久久中文字幕 | 久久天天躁狠狠躁夜夜免费观看 | 小鲜肉自慰网站xnxx | 在线播放亚洲第一字幕 | 无码人妻av免费一区二区三区 | 国产精品亚洲综合色区韩国 | 黑人玩弄人妻中文在线 | 日本免费一区二区三区最新 | 爽爽影院免费观看 | а√资源新版在线天堂 | 亚洲欧美国产精品专区久久 | 大色综合色综合网站 | 丰满少妇弄高潮了www | yw尤物av无码国产在线观看 | 少妇愉情理伦片bd | 久久国产劲爆∧v内射 | 性欧美熟妇videofreesex | 人妻少妇精品无码专区二区 | 久久综合网欧美色妞网 | 国内丰满熟女出轨videos | 欧美一区二区三区 | 精品水蜜桃久久久久久久 | 亚洲另类伦春色综合小说 | 女高中生第一次破苞av | 中文字幕+乱码+中文字幕一区 | 日本精品少妇一区二区三区 | 日韩精品无码一本二本三本色 | 99久久婷婷国产综合精品青草免费 | 亚洲国产欧美在线成人 | 久久精品国产一区二区三区肥胖 | 国产午夜福利100集发布 | 老熟妇仑乱视频一区二区 | 高潮喷水的毛片 | 亚洲成在人网站无码天堂 | 天天躁夜夜躁狠狠是什么心态 | 国产莉萝无码av在线播放 | 无套内谢的新婚少妇国语播放 | 国产香蕉97碰碰久久人人 | 国产亚洲精品久久久久久 | 夜夜高潮次次欢爽av女 | 丰腴饱满的极品熟妇 | 熟女少妇在线视频播放 | 色五月丁香五月综合五月 | 中文字幕无码日韩专区 | 精品熟女少妇av免费观看 | 色五月五月丁香亚洲综合网 | 2020久久香蕉国产线看观看 | 亚洲最大成人网站 | 色综合久久中文娱乐网 | 西西人体www44rt大胆高清 | 日日夜夜撸啊撸 | 亚洲一区二区三区国产精华液 | 成人性做爰aaa片免费看不忠 | 男女爱爱好爽视频免费看 | 久久久精品成人免费观看 | 最新国产乱人伦偷精品免费网站 | 人妻无码久久精品人妻 | 精品国产青草久久久久福利 | 日本www一道久久久免费榴莲 | 青草视频在线播放 | 亚洲国产av美女网站 | 成人亚洲精品久久久久软件 | 久久午夜无码鲁丝片 | 搡女人真爽免费视频大全 | 丰满人妻翻云覆雨呻吟视频 | 全球成人中文在线 | 精品少妇爆乳无码av无码专区 | 亚洲一区二区三区国产精华液 | 成人亚洲精品久久久久 | 精品人人妻人人澡人人爽人人 | 国产精品无码一区二区三区不卡 | 免费国产成人高清在线观看网站 | 一区二区传媒有限公司 | 国产国语老龄妇女a片 | 内射爽无广熟女亚洲 | 无码一区二区三区在线 | 性欧美大战久久久久久久 | 99久久人妻精品免费二区 | 色综合久久88色综合天天 | 成熟妇人a片免费看网站 | 中文字幕日韩精品一区二区三区 | 福利一区二区三区视频在线观看 | 乌克兰少妇xxxx做受 | 99久久精品日本一区二区免费 | 亲嘴扒胸摸屁股激烈网站 | 丁香啪啪综合成人亚洲 | 亚洲日本va午夜在线电影 | 欧洲极品少妇 | 丝袜人妻一区二区三区 | 丰满人妻翻云覆雨呻吟视频 | 久久久精品欧美一区二区免费 | 女人和拘做爰正片视频 | 成人免费视频在线观看 | 国产在热线精品视频 | 综合网日日天干夜夜久久 | 精品无码一区二区三区爱欲 | 久久久婷婷五月亚洲97号色 | 国产亚洲精品精品国产亚洲综合 | 亚洲色偷偷男人的天堂 | 久久人人97超碰a片精品 | 夜夜夜高潮夜夜爽夜夜爰爰 | 欧洲美熟女乱又伦 | 亚洲va中文字幕无码久久不卡 | 亚洲人成影院在线无码按摩店 | 久久久久成人片免费观看蜜芽 | 女人被男人躁得好爽免费视频 | 特黄特色大片免费播放器图片 | 樱花草在线播放免费中文 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国产福利视频一区二区 | 麻豆人妻少妇精品无码专区 | 国产超碰人人爽人人做人人添 | 97精品人妻一区二区三区香蕉 | 日本丰满护士爆乳xxxx | 国产成人无码区免费内射一片色欲 | 狠狠色噜噜狠狠狠狠7777米奇 | a国产一区二区免费入口 | 久久久久久久人妻无码中文字幕爆 | 亚洲欧美精品aaaaaa片 | 亚洲一区二区三区偷拍女厕 | 久久久久国色av免费观看性色 | 偷窥日本少妇撒尿chinese | 亚洲中文字幕成人无码 | 亚洲爆乳精品无码一区二区三区 | 乱人伦人妻中文字幕无码久久网 | 欧美熟妇另类久久久久久不卡 | 精品欧美一区二区三区久久久 | 国产suv精品一区二区五 | 国产精华av午夜在线观看 | 国产av人人夜夜澡人人爽麻豆 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产成人精品必看 | 国产亚洲精品久久久久久国模美 | 少妇无码一区二区二三区 | 嫩b人妻精品一区二区三区 | 99精品久久毛片a片 | 漂亮人妻洗澡被公强 日日躁 | 初尝人妻少妇中文字幕 | 午夜嘿嘿嘿影院 | 亚洲精品久久久久avwww潮水 | 欧美熟妇另类久久久久久不卡 | 美女毛片一区二区三区四区 | 女人高潮内射99精品 | 色诱久久久久综合网ywww | 性欧美牲交xxxxx视频 | 成人三级无码视频在线观看 | 天天躁日日躁狠狠躁免费麻豆 | 97精品人妻一区二区三区香蕉 | 水蜜桃av无码 | 亚洲爆乳大丰满无码专区 | 少妇愉情理伦片bd | 国产亚洲精品久久久久久 | 日本精品少妇一区二区三区 | 曰韩少妇内射免费播放 | 妺妺窝人体色www在线小说 | 国产亚洲精品精品国产亚洲综合 | 高清不卡一区二区三区 | 国产一区二区三区精品视频 | 一个人看的视频www在线 | 亚洲 日韩 欧美 成人 在线观看 | 一本色道久久综合亚洲精品不卡 | 波多野结衣aⅴ在线 | 免费观看的无遮挡av |