精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲伊人成综合成人网| 久久偷看各类女兵18女厕嘘嘘| 免费看又黄又无码的网站| 亚洲欧洲精品视频| 免费av网站大全久久| 久久躁狠狠躁夜夜爽| 欧类av怡春院| 日韩毛片免费看| 亚洲一区二区高清| 日本一区免费| 亚洲爱情岛论坛永久| 视频在线观看国产精品| 超碰精品一区二区三区乱码| 无码精品一区二区三区在线播放| jizz欧美| 五月天亚洲精品| 亚洲砖区区免费| 熟妇人妻av无码一区二区三区| 日韩精品一二三四| 久久久久久久一区二区| 2019男人天堂| 欧美影院天天5g天天爽| 777午夜精品免费视频| 午夜精品久久久内射近拍高清| 黄色成年人视频在线观看| 91在线码无精品| 成人网中文字幕| 国产女主播喷水视频在线观看 | 免费在线看电影| 欧美国产日韩在线观看| 好吊色欧美一区二区三区 | 日韩在线一区二区三区| 欧美精品videos| 久久av红桃一区二区禁漫| 亚洲人成伊人成综合图片| 精品久久久久久综合日本欧美| 亚洲欧美在线精品| 原纱央莉成人av片| 亚洲大尺度视频在线观看| 小说区视频区图片区| 国产精品天堂| 久久综合色8888| 国产精品一区免费观看| av无码精品一区二区三区宅噜噜| 青娱乐精品视频在线| 欧美一级电影免费在线观看| 国产精品99精品| 欧美.www| 欧美精品生活片| 日韩在线视频免费看| 欧洲毛片在线视频免费观看| 亚洲欧洲成视频免费观看| 国产一级二级视频| 噜噜噜狠狠夜夜躁精品仙踪林| 日韩欧美一级二级三级久久久| 超碰成人在线播放| 精品美女一区| 欧美日本在线一区| 亚洲一级片av| 国产精品2区| 日韩一二三四区| 亚欧美一区二区三区| 国内精品视频| 日韩限制级电影在线观看| 日韩精品xxx| 中文字幕日韩在线| 精品国产乱子伦一区| 99riav国产精品视频| 超碰成人在线免费| 亚洲国产精品久久久久| 性欧美丰满熟妇xxxx性久久久| 国产精品对白久久久久粗| 亚洲高清av在线| 亚洲精品理论片| 国产探花一区在线观看| 尤物yw午夜国产精品视频| 91精品久久久久久久久久久久| 色呦哟—国产精品| 久久九九国产精品怡红院| 中文字幕在线2021| 亚洲美女啪啪| 日韩av电影在线网| 一级特黄aaa| 粉嫩蜜臀av国产精品网站| 国产尤物99| 国产精品久久久久一区二区国产 | 亚洲最新无码中文字幕久久| 日本丶国产丶欧美色综合| 国产色视频在线播放| 免费看日产一区二区三区| 亚洲成在人线av| 日本二区在线观看| 一本到12不卡视频在线dvd| 久久免费国产视频| 免费观看日批视频| 国产成人av电影在线观看| 久久九九视频| 日本网站在线免费观看视频| 亚洲影视在线播放| 亚洲成人福利在线观看| 国产午夜亚洲精品一级在线| 日韩毛片在线观看| 久久成人小视频| 亚洲少妇在线| 91啪国产在线| 黄色av网址在线免费观看| 亚洲天堂精品视频| 人妻少妇被粗大爽9797pw| 在线欧美激情| 亚洲免费av网址| 欧美日韩中文字幕在线观看| 日韩精品亚洲专区| 成人av播放| 日韩在线观看www| 午夜激情一区二区| theporn国产精品| 欧美精品momsxxx| 欧美疯狂做受xxxx高潮| 中文字幕有码视频| 91欧美激情一区二区三区成人| 一本二本三本亚洲码 | 国产在线观看91精品一区| 人妻妺妺窝人体色www聚色窝| 中文字幕亚洲一区二区va在线| 日韩免费一级视频| 亚洲国产高清在线观看| 中文字幕日本欧美| 亚洲 欧美 中文字幕| 成人免费视频视频| 潘金莲一级淫片aaaaaa播放1| 日韩在线短视频| 亚洲精品丝袜日韩| 午夜精品久久久久久久久久久久久蜜桃 | 外国成人毛片| 亚洲视频日韩精品| 国产精品国产三级国产专区52| 国产伦精品一区二区三区在线观看| 日韩精品久久久毛片一区二区| caoporn-草棚在线视频最| 91麻豆精品国产91久久久久| 91无套直看片红桃在线观看| 美女久久一区| 欧美连裤袜在线视频| 77thz桃花论族在线观看| 欧美电影精品一区二区| 欧美成人aaa片一区国产精品| 免费成人av资源网| 一级做a爰片久久| 黄色成人在线观看网站| 中文字幕亚洲自拍| 一区二区日韩视频| 国产精品私人自拍| 不卡的av中文字幕| 99久久国产综合精品成人影院| 国产精品三级网站| 男人影院在线观看| 欧美日韩激情一区| 欧美黑人性猛交xxx| 国产久卡久卡久卡久卡视频精品| 综合久久国产| 麻豆国产一区| 欧美激情伊人电影| 天天操天天操天天操| 激情久久av一区av二区av三区| 醉酒壮男gay强迫野外xx| 免费在线观看成人av| 欧美色欧美亚洲另类七区| 成人天堂yy6080亚洲高清| 中文字幕欧美在线| 99久久久无码国产精品免费| 夜夜操天天操亚洲| 日韩综合第一页| 麻豆91精品| 亚洲在线色站| 视频一区在线| 91a在线视频| 国产福利小视频在线| 8v天堂国产在线一区二区| 免费在线视频一区二区| 99久久99久久久精品齐齐| 免费在线观看日韩视频| 日韩精品水蜜桃| 99porn视频在线| 在线高清av| 久久这里只有精品视频首页| 懂色av成人一区二区三区| 色美美综合视频| 免费在线观看a级片| 成人高清av在线| 日本熟妇人妻中出| 你懂的视频一区二区| 蜜桃999成人看片在线观看| 精品久久毛片| 97人人爽人人喊人人模波多| a视频网址在线观看| 精品国产三级a在线观看| 中文字幕日韩免费| 伊人色综合久久天天| 四虎永久免费影院| 国内一区二区在线| 999香蕉视频| 亚洲五月综合| 欧美主播一区二区三区美女 久久精品人 | 亚洲久本草在线中文字幕| 醉酒壮男gay强迫野外xx| 国产一区激情在线| 日韩在线xxx| 国产精品www994| 亚洲一区二区高清视频| 噜噜噜天天躁狠狠躁夜夜精品| 91精品免费视频| 亚洲最大网站| 国内精品久久久久| 免费黄色网页在线观看| 亚洲人成人99网站| 免费a级片在线观看| 欧美日韩一区二区三区四区五区 | 色婷婷激情久久| 国产亚洲欧美精品久久久www | 久久久久性色av无码一区二区| 久久久久久黄色| 波多野结衣一二三区| 国产精品一区一区| 日韩肉感妇bbwbbwbbw| 国产日韩欧美一区在线| 日韩国产成人无码av毛片| 欧美电影免费播放| 日本一区二区三区精品视频| 欧美jizz19性欧美| 国产精品免费一区二区三区在线观看| 欧美成人高清视频在线观看| 国产成人黄色av| 超碰在线99| 久久久久久久97| 91在线中文| 久久久国产精品亚洲一区| 超碰免费97在线观看| 亚洲欧美日韩久久久久久| 亚洲 精品 综合 精品 自拍| 精品国产免费一区二区三区四区| 国产手机av在线| 国产一级片毛片| 五月婷婷综合网| 97免费在线观看视频| 亚洲国产成人porn| 妺妺窝人体色www聚色窝仙踪| 亚洲人成精品久久久久久| 日韩福利在线视频| 国产精品天干天干在观线 | 亚洲人成伊人成综合网小说| 毛片视频免费播放| 国产精品久久毛片a| 成人性视频免费看| 中文字幕一区不卡| 亚洲av鲁丝一区二区三区| 亚洲乱码日产精品bd| 538精品在线观看| 亚洲一区二区三区视频在线| 欧美精品一级片| 亚洲午夜久久久| 久久精品视频8| 午夜私人影院久久久久| av大片在线免费观看| 色综合久久综合| 中文字幕在线日亚洲9| 欧美狂野另类xxxxoooo| 99久久久国产精品无码免费| 欧美v亚洲v综合ⅴ国产v| 天天色棕合合合合合合合| 日韩精品中文字幕有码专区| 精品美女视频在线观看免费软件 | 精品国产一区二区三区四区vr| 日韩影视在线观看| 天堂资源在线亚洲视频| 一本精品一区二区三区| 欧美成人精品免费| 性色一区二区| 亚洲精品20p| 丁香啪啪综合成人亚洲小说 | 97免费观看视频| 日韩精品一区二区三区中文不卡| 手机av在线免费观看| 在线精品播放av| 久久不射影院| 国产www精品| 久久九九精品视频| 激情视频在线观看一区二区三区| 久久99高清| 天天干天天色天天爽| 中文在线一区| 97人人爽人人| 99国产精品久| 四虎影视1304t| 亚洲高清免费观看高清完整版在线观看| 国产精品视频久久久久久久| 欧美日韩一级二级三级| 黄色一级大片在线免费看国产| 一区二区国产精品视频| 暖暖在线中文免费日本| 国产精品视频网| 久久夜色电影| 国产又大又长又粗又黄| av不卡在线看| 国产黄色一区二区三区 | 欧美一三区三区四区免费在线看| 蜜臀av中文字幕| www.日韩.com| 成年美女黄网站色大片不卡| 91探花福利精品国产自产在线| 亚洲小说图片| 欧美国产视频一区| 免费成人在线网站| 国产又黄又粗又猛又爽的视频 | 黑人巨大亚洲一区二区久| 2014亚洲精品| 日韩一区二区三区免费播放| 欧美亚洲精品一区二区| 国产精品1区2区3区| 亚洲ⅴ国产v天堂a无码二区| 精品毛片网大全| www.五月天激情| 日韩视频免费在线观看| 日韩一级二级| 裸体丰满少妇做受久久99精品| 欧美日韩久久| 老司机久久精品| 国产精品视频免费| 日韩黄色片网站| 亚洲精品视频二区| 蜜桃麻豆影像在线观看| 成人羞羞视频免费| 中文字幕一区二区精品区| 91精品999| 国产精品白丝在线| 精品国产www| 亚洲午夜久久久久久久| 在线观看v片| 久久综合久久综合这里只有精品| 欧美亚洲不卡| 在线观看一区二区三区视频| 亚洲美女免费在线| 99免费在线视频| 美女国内精品自产拍在线播放| 中文字幕成人| 中文一区一区三区免费| 久久国产精品99久久人人澡| 青青青视频在线播放| 欧美视频一二三区| 在线观看h片| 国产日韩换脸av一区在线观看| 日韩精品欧美| 国产精品久久久久久久av福利| 国产精品传媒视频| 亚洲天堂avav| 久久影院资源网| 成人盗摄视频| 黄色一级视频片| 久久久不卡影院| 在线观看免费观看在线| 久久伊人精品一区二区三区| 麻豆久久一区| 国产尤物av一区二区三区| 高清国产一区二区| 美日韩一二三区| 国产亚洲福利一区| 欧美a一级片| www.九色.com| 97精品超碰一区二区三区| 日本熟女毛茸茸| 伊人男人综合视频网| 91成人精品观看| 久久久久久久香蕉| av电影在线观看一区| 成人免费毛片视频| 久久精品国产91精品亚洲| 一区二区日韩| 男人的天堂99| 中文字幕一区三区| 亚洲精品视频专区| 国产精品99久久久久久久久久久久| 日本不卡免费一区| 亚洲成年人在线观看| 欧美日韩在线影院| 日本电影全部在线观看网站视频| 2019国产精品视频| 美女诱惑一区| 一区二区成人免费视频| 亚洲黄色www| 久久电影天堂| 免费看国产曰批40分钟| 日本一区二区三区在线不卡 | 日韩av在线最新| 久久99国产精品二区高清软件| 成人免费播放器| 欧美韩国一区二区| 亚洲免费一级片| 国产精品啪视频| 9色国产精品| 中国一级片在线观看| 精品夜色国产国偷在线|