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

深入理解 SecurityConfigurer

開發 前端
SecurityConfigurer 在 Spring Security 中是一個非常重要的角色。在前面的文章中,松哥曾經多次提到過,Spring Security 過濾器鏈中的每一個過濾器,都是通過 xxxConfigurer 來進行配置的,而這些 xxxConfigurer 實際上都是 SecurityConfigurer 的實現。

[[334361]]

我們來繼續擼 Spring Security 源碼。

SecurityConfigurer 在 Spring Security 中是一個非常重要的角色。在前面的文章中,松哥曾經多次提到過,Spring Security 過濾器鏈中的每一個過濾器,都是通過 xxxConfigurer 來進行配置的,而這些 xxxConfigurer 實際上都是 SecurityConfigurer 的實現。

所以我們今天有必要來跟大家把 SecurityConfigurer 從頭到尾捋一捋。

1. SecurityConfigurerSecurityConfigurer

本身是一個接口,我們來看下:

  1. public interface SecurityConfigurer<O, B extends SecurityBuilder<O>> { 
  2.  
  3.  void init(B builder) throws Exception; 
  4.  
  5.  void configure(B builder) throws Exception; 

可以看到,SecurityConfigurer 中主要是兩個方法,init 和 configure。

init 就是一個初始化方法。而 configure 則是一個配置方法。這里只是規范了方法的定義,具體的實現則在不同的實現類中。

需要注意的是這兩個方法的參數類型都是一個泛型 B,也就是 SecurityBuilder 的子類,關于 SecurityBuilder ,它是用來構建過濾器鏈的,松哥將在下篇文章中和大家介紹。

SecurityConfigurer 有三個實現類:

  • SecurityConfigurerAdapter
  • GlobalAuthenticationConfigurerAdapter
  • WebSecurityConfigurer

我們分別來看。

1.1 SecurityConfigurerAdapter

SecurityConfigurerAdapter實現了 SecurityConfigurer 接口,我們所使用的大部分的 xxxConfigurer 也都是 SecurityConfigurerAdapter 的子類。

SecurityConfigurerAdapter 在 SecurityConfigurer 的基礎上,還擴展出來了幾個非常好用的方法,我們一起來看下:

  1. public abstract class SecurityConfigurerAdapter<O, B extends SecurityBuilder<O>> 
  2.   implements SecurityConfigurer<O, B> { 
  3.  private B securityBuilder; 
  4.  
  5.  private CompositeObjectPostProcessor objectPostProcessor = new CompositeObjectPostProcessor(); 
  6.  
  7.  public void init(B builder) throws Exception { 
  8.  } 
  9.  
  10.  public void configure(B builder) throws Exception { 
  11.  } 
  12.  
  13.  public B and() { 
  14.   return getBuilder(); 
  15.  } 
  16.  protected final B getBuilder() { 
  17.   if (securityBuilder == null) { 
  18.    throw new IllegalStateException("securityBuilder cannot be null"); 
  19.   } 
  20.   return securityBuilder; 
  21.  } 
  22.  @SuppressWarnings("unchecked"
  23.  protected <T> T postProcess(T object) { 
  24.   return (T) this.objectPostProcessor.postProcess(object); 
  25.  } 
  26.  public void addObjectPostProcessor(ObjectPostProcessor<?> objectPostProcessor) { 
  27.   this.objectPostProcessor.addObjectPostProcessor(objectPostProcessor); 
  28.  } 
  29.  public void setBuilder(B builder) { 
  30.   this.securityBuilder = builder; 
  31.  } 
  32.  private static final class CompositeObjectPostProcessor implements 
  33.    ObjectPostProcessor<Object> { 
  34.   private List<ObjectPostProcessor<?>> postProcessors = new ArrayList<>(); 
  35.  
  36.   @SuppressWarnings({ "rawtypes""unchecked" }) 
  37.   public Object postProcess(Object object) { 
  38.    for (ObjectPostProcessor opp : postProcessors) { 
  39.     Class<?> oppClass = opp.getClass(); 
  40.     Class<?> oppType = GenericTypeResolver.resolveTypeArgument(oppClass, 
  41.       ObjectPostProcessor.class); 
  42.     if (oppType == null || oppType.isAssignableFrom(object.getClass())) { 
  43.      object = opp.postProcess(object); 
  44.     } 
  45.    } 
  46.    return object; 
  47.   } 
  48.   private boolean addObjectPostProcessor( 
  49.     ObjectPostProcessor<?> objectPostProcessor) { 
  50.    boolean result = this.postProcessors.add(objectPostProcessor); 
  51.    postProcessors.sort(AnnotationAwareOrderComparator.INSTANCE); 
  52.    return result; 
  53.   } 
  54.  } 
  1. CompositeObjectPostProcessor 首先一開始聲明了一個 CompositeObjectPostProcessor 實例,CompositeObjectPostProcessor 是 ObjectPostProcessor 的一個實現,ObjectPostProcessor 本身是一個后置處理器,該后置處理器默認有兩個實現,AutowireBeanFactoryObjectPostProcessor 和 CompositeObjectPostProcessor。其中 AutowireBeanFactoryObjectPostProcessor 主要是利用了 AutowireCapableBeanFactory 對 Bean 進行手動注冊,因為在 Spring Security 中,很多對象都是手動 new 出來的,這些 new 出來的對象和容器沒有任何關系,利用 AutowireCapableBeanFactory 可以將這些手動 new 出來的對象注入到容器中,而 AutowireBeanFactoryObjectPostProcessor 的主要作用就是完成這件事;CompositeObjectPostProcessor 則是一個復合的對象處理器,里邊維護了一個 List 集合,這個 List 集合中,大部分情況下只存儲一條數據,那就是 AutowireBeanFactoryObjectPostProcessor,用來完成對象注入到容器的操作,如果用戶自己手動調用了 addObjectPostProcessor 方法,那么 CompositeObjectPostProcessor 集合中維護的數據就會多出來一條,在 CompositeObjectPostProcessor#postProcess 方法中,會遍歷集合中的所有 ObjectPostProcessor,挨個調用其 postProcess 方法對對象進行后置處理。
  2. and 方法,該方法返回值是一個 securityBuilder,securityBuilder 實際上就是 HttpSecurity,我們在 HttpSecurity 中去配置不同的過濾器時,可以使用 and 方法進行鏈式配置,就是因為這里定義了 and 方法并返回了 securityBuilder 實例。

這便是 SecurityConfigurerAdapter 的主要功能,后面大部分的 xxxConfigurer 都是基于此類來實現的。

1.2 GlobalAuthenticationConfigurerAdapter

GlobalAuthenticationConfigurerAdapter 看名字就知道是一個跟全局配置有關的東西,它本身實現了 SecurityConfigurerAdapter 接口,但是并未對方法做具體的實現,只是將泛型具體化了:

  1. @Order(100) 
  2. public abstract class GlobalAuthenticationConfigurerAdapter implements 
  3.   SecurityConfigurer<AuthenticationManager, AuthenticationManagerBuilder> { 
  4.  
  5.  public void init(AuthenticationManagerBuilder auth) throws Exception { 
  6.  } 
  7.  
  8.  public void configure(AuthenticationManagerBuilder auth) throws Exception { 
  9.  } 

可以看到,SecurityConfigurer 中的泛型,現在明確成了 AuthenticationManager 和 AuthenticationManagerBuilder。所以 GlobalAuthenticationConfigurerAdapter 的實現類將來主要是和配置 AuthenticationManager 有關。當然也包括默認的用戶名密碼也是由它的實現類來進行配置的。

我們在 Spring Security 中使用的 AuthenticationManager 其實可以分為兩種,一種是局部的,另一種是全局的,這里主要是全局的配置。

1.3 WebSecurityConfigurer

還有一個實現類就是 WebSecurityConfigurer,這個可能有的小伙伴比較陌生,其實他就是我們天天用的 WebSecurityConfigurerAdapter 的父接口。

所以 WebSecurityConfigurer 的作用就很明確了,用戶擴展用戶自定義的配置。

SecurityConfigurer 默認主要是這三個實現,考慮到大多數的過濾器配置都是通過 SecurityConfigurerAdapter 進行擴展的,因此我們今天就通過這條線進行展開。另外兩條線松哥也將擼兩篇文章和大家介紹。

2. SecurityConfigurerAdapter

SecurityConfigurerAdapter 的實現主要也是三大類:

  • UserDetailsAwareConfigurer
  • AbstractHttpConfigurer
  • LdapAuthenticationProviderConfigurer

考慮到 LDAP 現在使用很少,所以這里我來和大家重點介紹下前兩個。

2.1 UserDetailsAwareConfigurer

這個配置類看名字大概就知道這是用來配置用戶類的。

 

AbstractDaoAuthenticationConfigurer

AbstractDaoAuthenticationConfigurer 中所做的事情比較簡單,主要是構造了一個默認的 DaoAuthenticationProvider,并為其配置 PasswordEncoder 和 UserDetailsService。

UserDetailsServiceConfigurer

UserDetailsServiceConfigurer 重寫了 AbstractDaoAuthenticationConfigurer 中的 configure 方法,在 configure 方法執行之前加入了 initUserDetailsService 方法,以方便開發展按照自己的方式去初始化 UserDetailsService。不過這里的 initUserDetailsService 方法是空方法。

UserDetailsManagerConfigurer

UserDetailsManagerConfigurer 中實現了 UserDetailsServiceConfigurer 中定義的 initUserDetailsService 方法,具體的實現邏輯就是將 UserDetailsBuilder 所構建出來的 UserDetails 以及提前準備好的 UserDetails 中的用戶存儲到 UserDetailsService 中。

該類同時添加了 withUser 方法用來添加用戶,同時還增加了一個 UserDetailsBuilder 用來構建用戶,這些邏輯都比較簡單,小伙伴們可以自行查看。

JdbcUserDetailsManagerConfigurer

JdbcUserDetailsManagerConfigurer 在父類的基礎上補充了 DataSource 對象,同時還提供了相應的數據庫查詢方法。

InMemoryUserDetailsManagerConfigurer

InMemoryUserDetailsManagerConfigurer 在父類的基礎上重寫了構造方法,將父類中的 UserDetailsService 實例定義為 InMemoryUserDetailsManager。

DaoAuthenticationConfigurer

DaoAuthenticationConfigurer 繼承自 AbstractDaoAuthenticationConfigurer,只是在構造方法中修改了一下 userDetailsService 而已。

有小伙伴可能要問了,JdbcUserDetailsManagerConfigurer 或者 InMemoryUserDetailsManagerConfigurer,到底在哪里可以用到呀?

松哥給大家舉一個簡單的例子:

  1. @Configuration 
  2. public class SecurityConfig extends WebSecurityConfigurerAdapter { 
  3.  
  4.     @Override 
  5.     protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
  6.         auth.inMemoryAuthentication().withUser("javaboy"
  7.                 .password("{noop}123"
  8.                 .roles("admin"); 
  9.     } 
  10.  
  11.     @Override 
  12.     protected void configure(HttpSecurity http) throws Exception { 
  13.         http.authorizeRequests() 
  14.                 .anyRequest().authenticated() 
  15.                 //省略 
  16.     } 

當你調用 auth.inMemoryAuthentication 進行配置時,實際上調用的就是 InMemoryUserDetailsManagerConfigurer。

這下明白了吧!

2.2 AbstractHttpConfigurer

AbstractHttpConfigurer 這一派中的東西非常多,我們所有的過濾器配置,都是它的子類,我們來看下都有哪些類?

 

可以看到,它的實現類還是非常多的。

這么多實現類,松哥就不一一給大家介紹了,我挑一個常用的 FormLoginConfigurer 來給大家詳細介紹,只要大家把這個理解了,其他的照貓畫虎就很好理解了。

我們一個一個來看。

2.2.1 AbstractHttpConfigurer

AbstractHttpConfigurer 繼承自 SecurityConfigurerAdapter,并增加了兩個方法,disable 和 withObjectPostProcessor:

  1. public abstract class AbstractHttpConfigurer<T extends AbstractHttpConfigurer<T, B>, B extends HttpSecurityBuilder<B>> 
  2.   extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, B> { 
  3.  
  4.  /** 
  5.   * Disables the {@link AbstractHttpConfigurer} by removing it. After doing so a fresh 
  6.   * version of the configuration can be applied. 
  7.   * 
  8.   * @return the {@link HttpSecurityBuilder} for additional customizations 
  9.   */ 
  10.  @SuppressWarnings("unchecked"
  11.  public B disable() { 
  12.   getBuilder().removeConfigurer(getClass()); 
  13.   return getBuilder(); 
  14.  } 
  15.  
  16.  @SuppressWarnings("unchecked"
  17.  public T withObjectPostProcessor(ObjectPostProcessor<?> objectPostProcessor) { 
  18.   addObjectPostProcessor(objectPostProcessor); 
  19.   return (T) this; 
  20.  } 

這兩個方法松哥之前都有給大家介紹過,disable 基本上是大家的老熟人了,我們常用的 .csrf().disable() 就是出自這里,那么從這里我們也可以看到 disable 的實現原理,就是從 getBuilder 中移除相關的 xxxConfigurer,getBuilder 方法獲取到的實際上就是 HttpSecurity,所以移除掉 xxxConfigurer 實際上就是從過濾器鏈中移除掉某一個過濾器,例如 .csrf().disable() 就是移除掉處理 csrf 的過濾器。

另一個增加的方法是 withObjectPostProcessor,這是為配置類添加手動添加后置處理器的。在 AbstractHttpConfigurer 的父類中其實有一個類似的方法就是 addObjectPostProcessor,但是 addObjectPostProcessor 只是一個添加方法,返回值為 void,而 withObjectPostProcessor 的返回值是當前配置類,也就是 xxxConfigurer,所以如果使用 withObjectPostProcessor 的話,可以使用鏈式配置,事實上,在松哥之前的文章,以及 vhr(https://github.com/lenve/vhr) 項目中,使用的也都是 withObjectPostProcessor 方法(當然,你也可以使用 addObjectPostProcessor,最終效果是一樣的)。

2.2.2 AbstractAuthenticationFilter

ConfigurerAbstractAuthenticationFilterConfigurer 類的功能比較多,源碼也是相當相當長。不過我們只需要抓住兩點即可,init 方法和 configure 方法,因為這兩個方法是所有 xxxConfigurer 的靈魂。

  1. @Override 
  2. public void init(B http) throws Exception { 
  3.  updateAuthenticationDefaults(); 
  4.  updateAccessDefaults(http); 
  5.  registerDefaultAuthenticationEntryPoint(http); 

init 方法主要干了三件事:

  1. updateAuthenticationDefaults 主要是配置了登錄處理地址,失敗跳轉地址,注銷成功跳轉地址。
  2. updateAccessDefaults 方法主要是對 loginPage、loginProcessingUrl、failureUrl 進行 permitAll 設置(如果用戶配置了 permitAll 的話)。
  3. registerDefaultAuthenticationEntryPoint 則是注冊異常的處理器。

再來看 configure 方法:

  1. @Override 
  2. public void configure(B http) throws Exception { 
  3.  PortMapper portMapper = http.getSharedObject(PortMapper.class); 
  4.  if (portMapper != null) { 
  5.   authenticationEntryPoint.setPortMapper(portMapper); 
  6.  } 
  7.  RequestCache requestCache = http.getSharedObject(RequestCache.class); 
  8.  if (requestCache != null) { 
  9.   this.defaultSuccessHandler.setRequestCache(requestCache); 
  10.  } 
  11.  authFilter.setAuthenticationManager(http 
  12.    .getSharedObject(AuthenticationManager.class)); 
  13.  authFilter.setAuthenticationSuccessHandler(successHandler); 
  14.  authFilter.setAuthenticationFailureHandler(failureHandler); 
  15.  if (authenticationDetailsSource != null) { 
  16.   authFilter.setAuthenticationDetailsSource(authenticationDetailsSource); 
  17.  } 
  18.  SessionAuthenticationStrategy sessionAuthenticationStrategy = http 
  19.    .getSharedObject(SessionAuthenticationStrategy.class); 
  20.  if (sessionAuthenticationStrategy != null) { 
  21.   authFilter.setSessionAuthenticationStrategy(sessionAuthenticationStrategy); 
  22.  } 
  23.  RememberMeServices rememberMeServices = http 
  24.    .getSharedObject(RememberMeServices.class); 
  25.  if (rememberMeServices != null) { 
  26.   authFilter.setRememberMeServices(rememberMeServices); 
  27.  } 
  28.  F filter = postProcess(authFilter); 
  29.  http.addFilter(filter); 

configure 中的邏輯就很簡答了,構建各種各樣的回調函數設置給 authFilter,authFilter 再去 postProcess 中走一圈注冊到 Spring 容器中,最后再把 authFilter 添加到過濾器鏈中。

這便是 AbstractAuthenticationFilterConfigurer 的主要功能。需要提醒大家的是,我們日常配置的,如:

  • loginPage
  • loginProcessingUrl
  • permitAll
  • defaultSuccessUrl
  • failureUrl
  • ...

等方法都是在這里定義的。

最后我們再來看看 FormLoginConfigurer。

2.2.3 FormLoginConfigurer

FormLoginConfigurer 在定義是,明確了 AbstractAuthenticationFilterConfigurer 中的泛型是 UsernamePasswordAuthenticationFilter,也就是我們這里最終要配置的過濾是 UsernamePasswordAuthenticationFilter。

FormLoginConfigurer 重寫了 init 方法,配置了一下默認的登錄頁面。其他的基本上都是從父類來的,未做太多改變。

另外我們日常配置的很多東西也是來自這里:

 

好啦,這就是 FormLoginConfigurer 這個配置類,FormLoginConfigurer 對應的過濾器是 UsernamePasswordAuthenticationFilter,小伙伴們可以自行分析其他的 xxxConfigurer,每一個 xxxConfigurer 都對應了一個 不同的 Filter。

 

 

3.小結好啦,今天就主要和大家分享一下 SecurityConfigurer 的源碼,當然這里還有很多值得再次仔細討論的東西,松哥將在后面的文章中繼續和大家分享。

本文轉載自微信公眾號「江南一點雨」,可以通過以下二維碼關注。轉載本文請聯系江南一點雨公眾號。

 

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2016-12-08 15:36:59

HashMap數據結構hash函數

2010-06-01 15:25:27

JavaCLASSPATH

2009-09-25 09:14:35

Hibernate日志

2021-02-17 11:25:33

前端JavaScriptthis

2013-09-22 14:57:19

AtWood

2023-10-19 11:12:15

Netty代碼

2017-08-15 13:05:58

Serverless架構開發運維

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2020-09-23 10:00:26

Redis數據庫命令

2017-01-10 08:48:21

2019-06-25 10:32:19

UDP編程通信

2024-02-21 21:14:20

編程語言開發Golang

2025-06-05 05:51:33

2022-11-04 09:43:05

Java線程

2024-03-12 00:00:00

Sora技術數據

2021-04-20 23:25:16

執行函數變量

2017-01-13 22:42:15

iosswift

2022-09-05 08:39:04

kubernetesk8s

2021-05-13 21:27:24

ThreadLocal多線程多線程并發安全

2022-11-09 08:12:07

點贊
收藏

51CTO技術棧公眾號

久热精品视频在线| 欧洲精品在线观看| 国产一区在线免费| 怡红院av久久久久久久| 欧美残忍xxxx极端| 亚洲精品一区二区三区影院| 国产美女三级视频| 免费在线看a| 成人av在线电影| 国产精品高清在线观看| 免费在线观看黄视频| 亚洲人成伊人成综合图片| 欧美理论片在线| 波多野结衣乳巨码无在线| av影片在线看| 不卡一区二区三区四区| 国产视频999| 成人午夜淫片100集| 91视频久久| 日韩毛片在线观看| 亚洲妇女无套内射精| 日本欧美一区| 欧美午夜电影在线| 丁香婷婷综合激情| 在线看黄色av| 久久色成人在线| 高清不卡日本v二区在线| 中文字幕无线码一区 | 一本色道久久综合亚洲精品婷婷| 亚洲国产精品二区| 精品在线观看免费| 国产精品亚洲欧美导航| 黄色在线免费观看| 在线不卡亚洲| 欧美激情一区二区久久久| 日本午夜精品视频| 欧美午夜精彩| 亚洲视频第一页| 久久一区二区电影| 成人中文字幕视频| 日韩天堂在线观看| 51自拍视频在线观看| 高清成人在线| 欧美性猛交xxxx免费看漫画| 精品少妇人妻av免费久久洗澡| 青青草视频在线免费直播| 亚洲美女免费视频| 国产日韩欧美大片| 4438x成人网全国最大| 一区视频在线播放| 五月天综合婷婷| 国产鲁鲁视频在线观看特色| 中文字幕一区二区三区在线不卡| 日韩一区二区电影在线观看| 国产69久久| 中文字幕第一区二区| 亚洲韩国在线| 午夜伦全在线观看| 日韩毛片视频在线看| 在线视频一二三区| av大全在线| 亚洲一区二区三区爽爽爽爽爽| 亚洲熟妇无码av在线播放| av电影在线地址| 疯狂欧美牲乱大交777| 国产成人a亚洲精v品无码| 成人av观看| 91精品1区2区| 亚洲天堂国产视频| 日韩第一区第二区| 亚洲国产91精品在线观看| 亚洲综合自拍网| 精品在线观看入口| 日韩亚洲成人av在线| 全程偷拍露脸中年夫妇| 亚洲黄色成人| 日韩美女福利视频| 91麻豆国产视频| 激情av综合网| 韩国成人一区| eeuss影院www在线播放| 亚洲美女一区二区三区| 黄色免费视频大全| 国产91欧美| 精品国产一区二区三区久久影院 | 久久久777精品电影网影网| 亚洲va久久久噜噜噜久久狠狠| 老司机精品视频在线观看6| 亚洲一区二区三区美女| 免费看黄色一级大片| 精品一区二区三区在线观看视频| 精品成人私密视频| 女人黄色一级片| 午夜天堂精品久久久久| 国产成人精品日本亚洲| 国产精品久久久午夜夜伦鲁鲁| 成人午夜看片网址| 亚洲精品9999| 超碰在线99| 在线电影国产精品| 黄色aaa视频| 欧美久久综合| 国产精品黄色影片导航在线观看| 亚洲奶汁xxxx哺乳期| 久久精品视频一区二区三区| 91视频成人免费| 日韩av一级| 精品国产a毛片| 国产日产在线观看| 久久成人免费| 国产精品99久久久久久久| 一广人看www在线观看免费视频| 亚洲永久免费av| www.这里只有精品| 色愁久久久久久| 欧美国产第一页| 一二区在线观看| 久久嫩草精品久久久精品| 青草视频在线观看视频| 伦一区二区三区中文字幕v亚洲| 亚洲精品国产精品久久清纯直播| 久久国产精品国语对白| 全国精品久久少妇| 裸体丰满少妇做受久久99精品| av毛片在线看| 91精品国产欧美一区二区18 | 亚洲av无日韩毛片久久| 国产亚洲一区二区三区不卡| 午夜精品久久久久久久久久久久久| 国产精品玖玖玖| 亚洲国产精品ⅴa在线观看| 免费无遮挡无码永久视频| 无码国模国产在线观看| 久久亚洲精品毛片| 国产精品玖玖玖| 最新久久zyz资源站| 亚洲 欧美 日韩系列| 一区二区美女| 秋霞午夜一区二区| 黄色av网址在线免费观看| 狠狠色狠色综合曰曰| www.17c.com喷水少妇| 好吊视频一区二区三区四区| 91传媒在线免费观看| 五月婷婷视频在线观看| 日韩一区二区在线观看| 国产黄色的视频| 国产在线精品一区二区不卡了 | 国产情侣一区| 久久99精品国产99久久| 午夜裸体女人视频网站在线观看| 亚洲第一在线视频| wwwxxx亚洲| 91视频在线观看免费| 欧美成人黑人猛交| 精品高清久久| 国产精品福利网站| 99re在线视频| 91精品黄色片免费大全| www.毛片com| 粉嫩嫩av羞羞动漫久久久| 国产乱淫av片杨贵妃| 欧美调教在线| 国产成人极品视频| 毛片在线播放a| 日韩免费视频一区二区| 国产第一页第二页| 91在线高清观看| 天天操天天摸天天爽| 婷婷综合视频| 国产精品yjizz| 成人教育av| 日韩一区二区在线视频| 性中国xxx极品hd| 精品久久久久久中文字幕| 97人妻精品一区二区免费| 麻豆一区二区三| 欧美一级视频在线播放| 九九综合在线| 亚洲精品免费网站| 中国色在线日|韩| 丝袜一区二区三区| 亚洲第一色视频| 色狠狠色狠狠综合| 五月婷婷一区二区| 久久综合九色综合欧美亚洲| 成 人 黄 色 小说网站 s色| 亚洲网站啪啪| 色噜噜一区二区| 99ri日韩精品视频| 国产精品黄色av| sm捆绑调教国产免费网站在线观看 | 国产美女18xxxx免费视频| 一区在线播放| 亚洲欧洲中文| 好吊妞视频这里有精品 | 欧美高清视频在线| 国产精品麻豆一区二区三区| 欧美大片国产精品| 五月婷婷丁香在线| 午夜影院久久久| 欧美一级特黄高清视频| 91一区二区在线| 尤物网站在线看| 久久午夜电影| 丰满少妇大力进入| 一区二区三区中文| 丝袜足脚交91精品| 欧美激情极品| 成人av蜜桃| 97色婷婷成人综合在线观看| 欧美综合激情网| 欧美aaa免费| 精品国产一区二区三区久久狼5月| 性感美女一级片| 欧美成人乱码一区二区三区| 亚洲一区二区激情| 91久久精品一区二区三| 91国产丝袜播放在线| 亚洲男人的天堂在线aⅴ视频| 亚洲综合欧美综合| 久久蜜桃香蕉精品一区二区三区| 亚洲色图欧美日韩| 国产大陆精品国产| 色姑娘综合天天| 久久99久久99| 国产主播中文字幕| 免费亚洲一区| 免费在线观看亚洲视频| 激情综合中文娱乐网| 成年人视频大全| 久久精品免费一区二区三区| 亚洲图片在线观看| 成人3d动漫在线观看| 欧洲成人一区二区| 最新精品国偷自产在线| 久久精品人人做人人爽电影| 欧美一级一片| 久久偷看各类wc女厕嘘嘘偷窃 | 欧美一区二区视频在线| 天堂俺去俺来也www久久婷婷| 国产一区二区精品在线| 粉嫩精品导航导航| 国产一区二区无遮挡| 欧美天堂社区| 欧美日韩一区二区三区在线视频| 欧美日韩一区二区三区四区不卡| 久久99精品久久久水蜜桃| 天堂在线资源8| 欧美午夜精品久久久久久孕妇 | 国产成人精品综合久久久久99 | 色婷婷精品大视频在线蜜桃视频| 国产大片中文字幕| 午夜精品久久久久影视| 国产成人在线免费观看视频| 高潮白浆女日韩av免费看| 二区视频在线观看| 欧洲av一区二区嗯嗯嗯啊| 亚洲一区二区三区高清视频| 日韩一区二区在线观看视频| 黄色成人一级片| 日韩电影中文字幕在线| 国产一二三区在线| 国产精品老牛| 日韩免费视频在线观看| 黄瓜视频成人app免费| 国产精品扒开腿爽爽爽视频 | 在线观看一区二区视频| 伊人网av在线| 欧美一区二区三区婷婷月色| 亚洲精品久久久久久久久久久久久久 | 青青草久久爱| 日本最新一区二区三区视频观看| 91蜜臀精品国产自偷在线| 丰满人妻一区二区三区53号| 亚洲手机视频| 免费看污污网站| 国产成人精品亚洲日本在线桃色 | 欧美亚洲在线观看| 成人免费视频观看| 99国精产品一二二线| 亚洲丁香日韩| 一级黄色录像免费看| 国产精品视频| 国产无色aaa| www.欧美精品一二区| 国产毛片欧美毛片久久久| 亚洲欧美另类小说视频| 欧美一二三区视频| 欧美一区二区在线不卡| 天天操天天射天天舔| 日韩中文字幕在线看| 草草在线观看| 成人女保姆的销魂服务| 亚洲视频分类| 国产精品啪啪啪视频| 久久一区欧美| 久久久久亚洲av无码专区首jn| 91污片在线观看| 久久久久久久久久网站| 色婷婷久久久久swag精品| 精品人妻少妇AV无码专区| 国产丝袜高跟一区| 污影院在线观看| 国产日韩中文字幕| 一道本一区二区三区| 波多野结衣av一区二区全免费观看| 日韩av一区二| 亚洲av片不卡无码久久| 一区二区三区成人| 亚洲在线免费观看视频| 日韩免费在线电影| 91精品在线影院| 综合色就爱涩涩涩综合婷婷| 激情五月婷婷六月| 91好色先生tv| 欧美日韩国产另类不卡| 猫咪在线永久网站| 91禁外国网站| 日日夜夜精品视频| 欧美aaa在线观看| 日韩精品1区2区3区| 日本xxxx裸体xxxx| 亚洲成人av福利| 亚洲国产日韩在线观看| 久久精品一偷一偷国产| 久久三级毛片| 日本一区二区在线视频观看| 亚洲一卡久久| 亚洲最大的黄色网| 亚洲成a人片在线观看中文| www.黄色一片| 久久精品国产一区| 91精品在线免费视频| 亚洲精品乱码久久久久久蜜桃91| 久热re这里精品视频在线6| 中文字幕高清视频| 欧美日韩国产一区二区| 五月天激情婷婷| 午夜精品一区二区三区在线视| 超碰成人在线观看| www.成年人视频| 成+人+亚洲+综合天堂| 日本熟女一区二区| 亚洲高清一二三区| xx欧美视频| 欧美日韩精品中文字幕一区二区| 亚欧美中日韩视频| 天天躁日日躁aaaa视频| 欧洲在线/亚洲| av电影在线观看| 成人精品久久av网站| 91精品综合| 国产大学生av| 午夜不卡av免费| 日本ー区在线视频| 国产精品人人做人人爽| 国产精品99久久久久久动医院| 日韩不卡的av| 亚洲高清免费观看| 日本不卡视频一区二区| 国产精品视频在线观看| 亚洲精品久久久| 国产国语老龄妇女a片| 欧美丝袜第一区| a天堂中文在线88| 91欧美激情另类亚洲| 亚洲午夜激情在线| 无码人妻精品一区二区中文| 欧美日韩一区久久| 日本色护士高潮视频在线观看| 九九九九精品| 日韩高清在线不卡| 男女性高潮免费网站| 亚洲精品成人久久电影| 欧美国产日韩电影| 日韩精品福利片午夜免费观看| 9l国产精品久久久久麻豆| 波多野结衣黄色网址| 久久久精品国产亚洲| 欧美亚洲大陆| 日韩av一卡二卡三卡| 五月天激情综合| 一区二区三区视频在线观看视频| y111111国产精品久久婷婷| 久久不射2019中文字幕| 中文字幕av播放| 亚洲免费一级电影| 久久精品九色| 免费日韩视频在线观看| 一区二区视频免费在线观看| 精品99又大又爽又硬少妇毛片| 亚洲自拍偷拍一区| 久久久夜精品| 国产在线视频你懂的| 在线观看国产精品日韩av| 成人免费在线电影网| 中文字幕中文在线| 色呦呦国产精品| 超黄网站在线观看|