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

Spring Security 中如何讓上級擁有下級的所有權限?

開發 項目管理
本文基于當前 Spring Security 5.3.4 來分析,為什么要強調最新版呢?因為在在 5.0.11 版中,角色繼承配置和現在不一樣。舊版的方案我們現在不討論了,直接來看當前最新版是怎么處理的。

[[341337]]

 本文基于當前 Spring Security 5.3.4 來分析,為什么要強調最新版呢?因為在在 5.0.11 版中,角色繼承配置和現在不一樣。舊版的方案我們現在不討論了,直接來看當前最新版是怎么處理的。

1.角色繼承案例

我們先來一個簡單的權限案例。

創建一個 Spring Boot 項目,添加 Spring Security 依賴,并創建兩個測試用戶,如下:

  1. @Override 
  2. protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
  3.     auth.inMemoryAuthentication() 
  4.             .withUser("javaboy"
  5.             .password("{noop}123").roles("admin"
  6.             .and() 
  7.             .withUser("江南一點雨"
  8.             .password("{noop}123"
  9.             .roles("user"); 

然后準備三個測試接口,如下:

  1. @RestController 
  2. public class HelloController { 
  3.     @GetMapping("/hello"
  4.     public String hello() { 
  5.         return "hello"
  6.     } 
  7.  
  8.     @GetMapping("/admin/hello"
  9.     public String admin() { 
  10.         return "admin"
  11.     } 
  12.  
  13.     @GetMapping("/user/hello"
  14.     public String user() { 
  15.         return "user"
  16.     } 

這三個測試接口,我們的規劃是這樣的:

  1. /hello 是任何人都可以訪問的接口
  2. /admin/hello 是具有 admin 身份的人才能訪問的接口
  3. /user/hello 是具有 user 身份的人才能訪問的接口
  4. 所有 user 能夠訪問的資源,admin 都能夠訪問

注意第四條規范意味著所有具備 admin 身份的人自動具備 user 身份。

接下來我們來配置權限的攔截規則,在 Spring Security 的 configure(HttpSecurity http) 方法中,代碼如下:

  1. http.authorizeRequests() 
  2.         .antMatchers("/admin/**").hasRole("admin"
  3.         .antMatchers("/user/**").hasRole("user"
  4.         .anyRequest().authenticated() 
  5.         .and() 
  6.         ... 
  7.         ... 

這里的匹配規則我們采用了 Ant 風格的路徑匹配符,Ant 風格的路徑匹配符在 Spring 家族中使用非常廣泛,它的匹配規則也非常簡單:

通配符 含義
** 匹配多層路徑
* 匹配一層路徑
? 匹配任意單個字符

上面配置的含義是:

  1. 如果請求路徑滿足 /admin/** 格式,則用戶需要具備 admin 角色。
  2. 如果請求路徑滿足 /user/** 格式,則用戶需要具備 user 角色。
  3. 剩余的其他格式的請求路徑,只需要認證(登錄)后就可以訪問。

注意代碼中配置的三條規則的順序非常重要,和 Shiro 類似,Spring Security 在匹配的時候也是按照從上往下的順序來匹配,一旦匹配到了就不繼續匹配了,所以攔截規則的順序不能寫錯。

如果使用角色繼承,這個功能很好實現,我們只需要在 SecurityConfig 中添加如下代碼來配置角色繼承關系即可:

  1. @Bean 
  2. RoleHierarchy roleHierarchy() { 
  3.     RoleHierarchyImpl hierarchy = new RoleHierarchyImpl(); 
  4.     hierarchy.setHierarchy("ROLE_admin > ROLE_user"); 
  5.     return hierarchy; 

注意,在配置時,需要給角色手動加上 ROLE_ 前綴。上面的配置表示 ROLE_admin 自動具備 ROLE_user 的權限。

接下來,我們啟動項目進行測試。

項目啟動成功后,我們首先以 江南一點雨的身份進行登錄:

登錄成功后,分別訪問 /hello,/admin/hello 以及 /user/hello 三個接口,其中:

  1. /hello 因為登錄后就可以訪問,這個接口訪問成功。
  2. /admin/hello 需要 admin 身份,所以訪問失敗。
  3. /user/hello 需要 user 身份,所以訪問成功。

再以 javaboy 身份登錄,登錄成功后,我們發現 javaboy 也能訪問 /user/hello 這個接口了,說明我們的角色繼承配置沒問題!

2.原理分析

這里配置的核心在于我們提供了一個 RoleHierarchy 實例,所以我們的分析就從該類入手。

RoleHierarchy 是一個接口,該接口中只有一個方法:

  1. public interface RoleHierarchy { 
  2.  Collection<? extends GrantedAuthority> getReachableGrantedAuthorities( 
  3.    Collection<? extends GrantedAuthority> authorities); 
  4.  

這個方法參數 authorities 是一個權限集合,從方法名上看方法的返回值是一個可訪問的權限集合。

舉個簡單的例子,假設角色層次結構是 ROLE_A > ROLE_B > ROLE_C,現在直接給用戶分配的權限是 ROLE_A,但實際上用戶擁有的權限有 ROLE_A、ROLE_B 以及 ROLE_C。

getReachableGrantedAuthorities 方法的目的就是是根據角色層次定義,將用戶真正可以觸達的角色解析出來。

RoleHierarchy 接口有兩個實現類,如下圖:

  • NullRoleHierarchy 這是一個空的實現,將傳入的參數原封不動返回。
  • RoleHierarchyImpl 這是我們上文所使用的實現,這個會完成一些解析操作。

我們來重點看下 RoleHierarchyImpl 類。

這個類中實際上就四個方法setHierarchy、getReachableGrantedAuthorities、buildRolesReachableInOneStepMap以及 buildRolesReachableInOneOrMoreStepsMap,我們來逐個進行分析。

首先是我們一開始調用的 setHierarchy 方法,這個方法用來設置角色層級關系:

  1. public void setHierarchy(String roleHierarchyStringRepresentation) { 
  2.  this.roleHierarchyStringRepresentation = roleHierarchyStringRepresentation; 
  3.  if (logger.isDebugEnabled()) { 
  4.   logger.debug("setHierarchy() - The following role hierarchy was set: " 
  5.     + roleHierarchyStringRepresentation); 
  6.  } 
  7.  buildRolesReachableInOneStepMap(); 
  8.  buildRolesReachableInOneOrMoreStepsMap(); 

用戶傳入的字符串變量設置給 roleHierarchyStringRepresentation 屬性,然后通過 buildRolesReachableInOneStepMap 和 buildRolesReachableInOneOrMoreStepsMap 方法完成對角色層級的解析。

buildRolesReachableInOneStepMap 方法用來將角色關系解析成一層一層的形式。我們來看下它的源碼:

  1. private void buildRolesReachableInOneStepMap() { 
  2.  this.rolesReachableInOneStepMap = new HashMap<>(); 
  3.  for (String line : this.roleHierarchyStringRepresentation.split("\n")) { 
  4.   String[] roles = line.trim().split("\\s+>\\s+"); 
  5.   for (int i = 1; i < roles.length; i++) { 
  6.    String higherRole = roles[i - 1]; 
  7.    GrantedAuthority lowerRole = new SimpleGrantedAuthority(roles[i]); 
  8.    Set<GrantedAuthority> rolesReachableInOneStepSet; 
  9.    if (!this.rolesReachableInOneStepMap.containsKey(higherRole)) { 
  10.     rolesReachableInOneStepSet = new HashSet<>(); 
  11.     this.rolesReachableInOneStepMap.put(higherRole, rolesReachableInOneStepSet); 
  12.    } else { 
  13.     rolesReachableInOneStepSet = this.rolesReachableInOneStepMap.get(higherRole); 
  14.    } 
  15.    rolesReachableInOneStepSet.add(lowerRole); 
  16.   } 
  17.  } 

首先大家看到,按照換行符來解析用戶配置的多個角色層級,這是什么意思呢?

我們前面案例中只是配置了 ROLE_admin > ROLE_user,如果你需要配置多個繼承關系,怎么配置呢?多個繼承關系用 \n 隔開即可,如下 ROLE_A > ROLE_B \n ROLE_C > ROLE_D。還有一種情況,如果角色層級關系是連續的,也可以這樣配置 ROLE_A > ROLE_B > ROLE_C > ROLE_D。

所以這里先用 \n 將多層繼承關系拆分開形成一個數組,然后對數組進行遍歷。

在具體遍歷中,通過 > 將角色關系拆分成一個數組,然后對數組進行解析,高一級的角色作為 key,低一級的角色作為 value。

代碼比較簡單,最終的解析出來存入 rolesReachableInOneStepMap 中的層級關系是這樣的:

假設角色繼承關系是 ROLE_A > ROLE_B \n ROLE_C > ROLE_D \n ROLE_C > ROLE_E,Map 中的數據是這樣:

  • A-->B
  • C-->[D,E]

假設角色繼承關系是 ROLE_A > ROLE_B > ROLE_C > ROLE_D,Map 中的數據是這樣:

  • A-->B
  • B-->C
  • C-->D

這是 buildRolesReachableInOneStepMap 方法解析出來的 rolesReachableInOneStepMap 集合。

接下來的 buildRolesReachableInOneOrMoreStepsMap 方法則是對 rolesReachableInOneStepMap 集合進行再次解析,將角色的繼承關系拉平。

例如 rolesReachableInOneStepMap 中保存的角色繼承關系如下:

  • A-->B
  • B-->C
  • C-->D

經過 buildRolesReachableInOneOrMoreStepsMap 方法解析之后,新的 Map 中保存的數據如下:

  • A-->[B、C、D]
  • B-->[C、D]
  • C-->D

這樣解析完成后,每一個角色可以觸達到的角色就一目了然了。

我們來看下 buildRolesReachableInOneOrMoreStepsMap 方法的實現邏輯:

  1. private void buildRolesReachableInOneOrMoreStepsMap() { 
  2.  this.rolesReachableInOneOrMoreStepsMap = new HashMap<>(); 
  3.  for (String roleName : this.rolesReachableInOneStepMap.keySet()) { 
  4.   Set<GrantedAuthority> rolesToVisitSet = new HashSet<>(this.rolesReachableInOneStepMap.get(roleName)); 
  5.   Set<GrantedAuthority> visitedRolesSet = new HashSet<>(); 
  6.   while (!rolesToVisitSet.isEmpty()) { 
  7.    GrantedAuthority lowerRole = rolesToVisitSet.iterator().next(); 
  8.    rolesToVisitSet.remove(lowerRole); 
  9.    if (!visitedRolesSet.add(lowerRole) || 
  10.      !this.rolesReachableInOneStepMap.containsKey(lowerRole.getAuthority())) { 
  11.     continue
  12.    } else if (roleName.equals(lowerRole.getAuthority())) { 
  13.     throw new CycleInRoleHierarchyException(); 
  14.    } 
  15.    rolesToVisitSet.addAll(this.rolesReachableInOneStepMap.get(lowerRole.getAuthority())); 
  16.   } 
  17.   this.rolesReachableInOneOrMoreStepsMap.put(roleName, visitedRolesSet); 
  18.  } 

這個方法還比較巧妙。首先根據 roleName 從 rolesReachableInOneStepMap 中獲取對應的 rolesToVisitSet,這個 rolesToVisitSet 是一個 Set 集合,對其進行遍歷,將遍歷結果添加到 visitedRolesSet 集合中,如果 rolesReachableInOneStepMap 集合的 key 不包含當前讀取出來的 lowerRole,說明這個 lowerRole 就是整個角色體系中的最底層,直接 continue。否則就把 lowerRole 在 rolesReachableInOneStepMap 中對應的 value 拿出來繼續遍歷。

最后將遍歷結果存入 rolesReachableInOneOrMoreStepsMap 集合中即可。

這個方法有點繞,小伙伴們可以自己打個斷點品一下。

看了上面的分析,小伙伴們可能發現了,其實角色繼承,最終還是拉平了去對比。

我們定義的角色有層級,但是代碼中又將這種層級拉平了,方便后續的比對。

最后還有一個 getReachableGrantedAuthorities 方法,根據傳入的角色分析出其可能潛在包含的一些角色:

  1. public Collection<GrantedAuthority> getReachableGrantedAuthorities( 
  2.   Collection<? extends GrantedAuthority> authorities) { 
  3.  if (authorities == null || authorities.isEmpty()) { 
  4.   return AuthorityUtils.NO_AUTHORITIES; 
  5.  } 
  6.  Set<GrantedAuthority> reachableRoles = new HashSet<>(); 
  7.  Set<String> processedNames = new HashSet<>(); 
  8.  for (GrantedAuthority authority : authorities) { 
  9.   if (authority.getAuthority() == null) { 
  10.    reachableRoles.add(authority); 
  11.    continue
  12.   } 
  13.   if (!processedNames.add(authority.getAuthority())) { 
  14.    continue
  15.   } 
  16.   reachableRoles.add(authority); 
  17.   Set<GrantedAuthority> lowerRoles = this.rolesReachableInOneOrMoreStepsMap.get(authority.getAuthority()); 
  18.   if (lowerRoles == null) { 
  19.    continue
  20.   } 
  21.   for (GrantedAuthority role : lowerRoles) { 
  22.    if (processedNames.add(role.getAuthority())) { 
  23.     reachableRoles.add(role); 
  24.    } 
  25.   } 
  26.  } 
  27.  List<GrantedAuthority> reachableRoleList = new ArrayList<>(reachableRoles.size()); 
  28.  reachableRoleList.addAll(reachableRoles); 
  29.  return reachableRoleList; 

這個方法的邏輯比較直白,就是從 rolesReachableInOneOrMoreStepsMap 集合中查詢出當前角色真正可訪問的角色信息。

3.RoleHierarchyVoter

getReachableGrantedAuthorities 方法將在 RoleHierarchyVoter 投票器中被調用。

  1. public class RoleHierarchyVoter extends RoleVoter { 
  2.  private RoleHierarchy roleHierarchy = null
  3.  public RoleHierarchyVoter(RoleHierarchy roleHierarchy) { 
  4.   Assert.notNull(roleHierarchy, "RoleHierarchy must not be null"); 
  5.   this.roleHierarchy = roleHierarchy; 
  6.  } 
  7.  @Override 
  8.  Collection<? extends GrantedAuthority> extractAuthorities( 
  9.    Authentication authentication) { 
  10.   return roleHierarchy.getReachableGrantedAuthorities(authentication 
  11.     .getAuthorities()); 
  12.  } 

關于 Spring Security 投票器,將是另外一個故事,松哥將在下篇文章中和小伙伴們分享投票器和決策器~

4.小結

好啦,今天就和小伙伴們簡簡單單聊一下角色繼承的問題,感興趣的小伙伴可以自己試一下~如果覺得有收獲,記得點個在看鼓勵下松哥哦~

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

 

 

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

2011-01-07 09:19:35

Linux文件權限

2024-03-19 14:43:55

Rust編譯所有權

2022-11-03 15:14:43

Linux文件權限

2023-01-27 14:47:30

DevOps軟件開發工程師

2009-11-28 20:21:14

2011-01-20 07:50:51

Linux文件系統管理所有權

2017-07-27 13:34:52

Rust所有權數據

2022-05-30 00:19:13

元宇宙NFTWeb3

2022-03-18 08:00:00

區塊鏈代幣以太坊

2024-01-10 09:26:52

Rust所有權編程

2020-09-16 08:07:54

權限粒度Spring Secu

2018-12-14 10:08:23

物聯網訂閱IOT

2021-07-30 05:12:54

智能指針C++編程語言

2024-09-02 10:40:18

2024-04-24 12:41:10

Rust安全性內存

2013-08-16 10:46:20

2018-01-23 11:15:28

云計算數據平臺云平臺

2023-04-10 16:25:37

區塊鏈去中心化安全

2009-09-12 09:46:47

Windows 7所有權添加

2017-10-23 12:42:42

點贊
收藏

51CTO技術棧公眾號

少妇av一区二区| 久久久久噜噜噜亚洲熟女综合| 亚洲天堂av影院| 国产欧美一区二区精品久导航 | 亚洲午夜小视频| 国产 porn| 欧美寡妇性猛交xxx免费| 91视频在线看| 91久久在线观看| 日韩av黄色片| 99久久久久| 精品亚洲国产成av人片传媒 | 国产成人一区在线| 日本高清+成人网在线观看| 999福利视频| 激情视频极品美女日韩| 欧美日韩成人综合天天影院| 国产成a人亚洲精v品在线观看| 欧美18xxxxx| 国产成人激情av| 国产精品久久在线观看| 久久一区二区三| 日本精品三区| 亚洲国产精品嫩草影院久久| 中文字幕第17页| 不卡一二三区| 性做久久久久久免费观看欧美| 亚洲巨乳在线观看| 欧美孕妇性xxxⅹ精品hd| 国产精品18久久久久久vr| 国产不卡av在线| 日韩三级免费看| 欧美日韩日本国产亚洲在线| xxx欧美精品| 野外性满足hd| 国产厕拍一区| 日韩精品一区二区三区在线播放| 免费一级特黄录像| 欧美黑人粗大| 欧美日韩国产麻豆| 无码日本精品xxxxxxxxx| 免费日本一区二区三区视频| 国产午夜亚洲精品午夜鲁丝片| 国产在线精品一区二区三区》| av中文字幕观看| 精品一区二区三区不卡| 国产精品福利网站| 夜夜爽妓女8888视频免费观看| 99av国产精品欲麻豆| 九九精品在线观看| 亚洲精品久久久久久国| 久久要要av| 自拍偷拍亚洲欧美| 少妇精品无码一区二区免费视频| 亚欧洲精品视频在线观看| 亚洲第一二三四五区| 久草免费资源站| 一区二区三区自拍视频| 欧美一级高清片| 中文字幕乱码在线人视频| 国产精品视频一区二区三区| 欧美日韩国产天堂| 91网址在线观看精品| 免费观看在线一区二区三区| 欧美一区二区三区视频在线 | 群体交乱之放荡娇妻一区二区| 日韩精品一区在线观看| 亚洲欧美高清在线| 日韩大片在线免费观看| 亚洲男人av电影| 亚洲综合欧美综合| 天天做天天爱天天综合网| 欧美乱妇高清无乱码| 久久久综合久久| 亚洲精品麻豆| 国产99久久精品一区二区| 人人妻人人爽人人澡人人精品| 日本不卡在线视频| 91欧美激情另类亚洲| 亚洲h视频在线观看| 成人看片黄a免费看在线| 久久福利电影| 成人免费高清在线播放| 亚洲免费毛片网站| 很污的网站在线观看| 婷婷综合六月| 在线成人免费视频| 91九色蝌蚪porny| 欧美欧美黄在线二区| 色偷偷9999www| 久久综合亚洲色hezyo国产| 99热精品在线观看| 国产精品一区二区3区| 性猛交富婆╳xxx乱大交天津| 不卡的看片网站| 亚洲国产欧美日韩| 成年人视频免费在线播放| 色综合久久久久网| 伊人av在线播放| 国产不卡一区| 九九久久国产精品| 丁香社区五月天| 国产精品一区二区三区四区 | 日韩情爱电影在线观看| 久久久久久久久久久免费 | 日韩精品久久久久久久酒店| 日韩黄色免费电影| 国产精品一区二区在线观看| 成a人片在线观看www视频| 亚洲一区二区三区视频在线播放 | 福利一区二区三区四区| 免费成人在线观看视频| 国精产品99永久一区一区| 91成人高清| 精品久久久久久久久久国产| 亚洲五月激情网| 经典一区二区| 国内揄拍国内精品| 国产视频在线观看视频| 欧美国产亚洲另类动漫| 黄色一级在线视频| 欧美中文高清| 日韩一区二区三区国产| 超碰超碰超碰超碰| hitomi一区二区三区精品| 97精品国产97久久久久久粉红| 你懂得影院夜精品a| 亚洲成人精品久久久| 亚洲欧美另类日本| 蜜桃精品视频在线观看| 欧美日韩国产精品一卡| av中文在线资源| 欧美一级一区二区| 亚洲少妇xxx| 日本不卡一区二区三区| 免费精品视频一区二区三区| 538在线精品| 精品免费视频一区二区| 欧美精品成人久久| 国产麻豆午夜三级精品| 在线看成人av电影| 欧美性aaa| 正在播放欧美一区| 久久久999久久久| 久久久久久久久免费| www.浪潮av.com| 国产成人aa在线观看网站站| 久久久久久久国产精品| 欧美自拍偷拍一区二区| 性欧美疯狂xxxxbbbb| 国产亚洲精品成人a| 欧美视频官网| 国产日韩精品推荐| 国产夫妻在线播放| 日韩电影视频免费| 人人草在线观看| 国产日产欧美一区| 天美星空大象mv在线观看视频| 欧美影院三区| 成人在线中文字幕| 性网站在线观看| 精品福利一区二区三区免费视频| 国产精品1000| 久久综合网色—综合色88| 成人在线观看a| 久久在线视频| 亚洲va电影大全| 大黄网站在线观看| 亚洲黄色片网站| 4438国产精品一区二区| 日本一区二区三级电影在线观看 | 欧美一区二三区| 黄色毛片在线看| 欧美猛男超大videosgay| 少妇人妻丰满做爰xxx| 国产成人在线色| 337p粉嫩大胆噜噜噜鲁| 四虎国产精品免费观看| 91在线高清免费观看| 国产91足控脚交在线观看| 亚洲精品久久久一区二区三区 | 亚洲精品中文字幕| 中文字幕亚洲一区在线观看| 国产高清第一页| 欧美午夜丰满在线18影院| 成年人看的免费视频| 国产成人精品免费| 免费国产成人av| 欧美一区高清| 欧美一区二区福利| 国产精品欧美一区二区三区不卡| 97香蕉超级碰碰久久免费的优势| 北岛玲一区二区三区| 日韩欧美在线不卡| 黄色片视频免费| 亚洲一区二区三区四区在线观看 | 性欧美精品一区二区三区在线播放 | 免费在线观看黄色网| 亚洲国产第一页| 在线观看毛片网站| 欧美性jizz18性欧美| 久草视频手机在线| 国产亚洲午夜高清国产拍精品 | 久久久蜜臀国产一区二区| 99日在线视频| 天堂成人国产精品一区| 国产精品自拍合集| 婷婷六月综合| 日本一区高清在线视频| 都市激情亚洲欧美| 91久久国产精品91久久性色| 欧美无毛视频| 97色在线视频| 欧洲成人综合网| www.国产一区| 国产一级片在线| 亚洲国产另类 国产精品国产免费| 999国产精品视频免费| 欧美丝袜自拍制服另类| 国产伦精品一区二区三区视频网站| 一区二区三区av电影| 中文字幕第69页| 国产日韩欧美电影| 实拍女处破www免费看| 处破女av一区二区| 久久综合桃花网| 免费在线一区观看| 久久久精品麻豆| 视频一区视频二区中文| 熟女少妇在线视频播放| 国产精品日韩精品中文字幕| 高清不卡日本v二区在线| 精品午夜视频| 国产区精品在线观看| 成人黄色毛片| 欧美综合一区第一页| 国产羞羞视频在线播放| 日韩中文在线中文网三级| 男人av在线| 日韩高清免费观看| 殴美一级特黄aaaaaa| 精品免费国产二区三区| 国产成人精品一区二区无码呦 | 免费看一级大黄情大片| 亚洲高清成人| 成人在线国产视频| 欧美久久久久| 日韩日韩日韩日韩日韩| 欧美日韩一区自拍| 男女爱爱视频网站| 97精品一区二区| ijzzijzzij亚洲大全| 日韩欧美网站| 亚洲欧洲精品在线观看| 久久av超碰| 日韩亚洲视频在线| 国产精品亚洲二区| 欧美成人dvd在线视频| 国产一区二区三区日韩精品| 欧美成人蜜桃| 精品国产aⅴ| 亚洲一区精品视频| 奇米影视亚洲| 最新国产精品久久| 欧美激情日韩| 日韩精品免费一区| 国内自拍视频一区二区三区 | av在线电影观看| 久久视频免费观看| 91香蕉在线观看| 久久久久久中文字幕| 永久免费毛片在线播放| 日韩美女av在线免费观看| 成人黄色免费短视频| 91精品视频在线播放| 日本精品视频| 久久精品女人的天堂av| 欧美精品一二| 天堂√在线观看一区二区| 色777狠狠狠综合伊人| 日韩中文在线字幕| 激情av一区| 9久久婷婷国产综合精品性色| 久久99精品国产91久久来源| 91丨porny丨九色| 91麻豆swag| 欧美黄色一级生活片| 国产精品免费aⅴ片在线观看| 国产不卡在线观看视频| 亚洲国产人成综合网站| 久久久久久少妇| 欧美日韩综合在线免费观看| www.国产视频| 亚洲少妇中文在线| 992kp免费看片| 91综合精品国产丝袜长腿久久| 99精品国产高清一区二区| 91国内精品白嫩初高生| 午夜精品一区二区在线观看 | 国产在线播放一区二区三区| 性生交大片免费看l| 国产美女主播视频一区| 色欲av无码一区二区三区| 国产精品三级久久久久三级| 九九热只有精品| 欧美四级电影在线观看| 亚洲精品久久久久久久久久 | 成年人在线观看| 久久人人97超碰精品888| 亚洲精品555| 成人av蜜桃| 久久精品欧美一区| 青青草原成人网| 国产精品自拍网站| 神马久久久久久久久久久| 亚洲一区二区四区蜜桃| 亚洲一区中文字幕在线| 亚洲韩国欧洲国产日产av| 欧美r级在线| 国产精品第二页| 国产三级精品三级在线观看国产| 亚洲欧洲一区二区在线观看| 亚洲在线观看| 国产xxxxhd| 欧美韩日一区二区三区四区| av大全在线观看| 精品黑人一区二区三区久久| 91福利在线视频| 国产精品91久久久久久| 精品国产一区二区三区成人影院| 亚洲欧洲精品在线观看| 免费在线视频一区| 欧美熟妇一区二区| 舔着乳尖日韩一区| 亚洲高清视频网站| 日韩中文字幕欧美| 欧美综合影院| 亚洲高清视频一区| 久久综合激情| 成人免费av片| 偷窥国产亚洲免费视频| 99热这里只有精品66| 久久综合久久美利坚合众国| 国产美女久久| 亚洲欧美日韩不卡一区二区三区| 久久国产精品毛片| 你懂得在线视频| 亚洲成人av免费| 亚洲成熟女性毛茸茸| zzjj国产精品一区二区| 欧美国产视频| 深夜福利成人| 日本欧美久久久久免费播放网| 成人无码av片在线观看| 色综合视频在线观看| 毛片在线播放网站| 青青a在线精品免费观看| 欧美久久香蕉| 六月丁香婷婷在线| 91免费视频网| 伊人中文字幕在线观看| 国产一区二区三区在线视频 | 欧美在线国产| 三级黄色片免费看| 亚洲欧美在线aaa| www.香蕉视频| 久久人人爽人人爽人人片av高请| 秋霞影院一区二区三区| 久章草在线视频| 国产欧美精品国产国产专区| 国产美女三级无套内谢| 欧美日韩国产成人在线| 国产精品x8x8一区二区| 成人综合视频在线| 久久综合九色综合欧美就去吻 | 日韩av在线电影网| 天堂av中文在线观看| 亚洲高清在线播放| 国产一区二区伦理片| av中文在线播放| 亚洲情综合五月天| 久久天堂影院| 日韩小视频在线播放| 91色在线porny| 91一区二区视频| 欧美激情视频一区二区| 欧美人妖视频| 午夜免费福利网站| 午夜久久久影院| 欧美成人三区| 精品欧美一区二区三区久久久| 日韩电影网1区2区| 国产精品第九页| 欲色天天网综合久久| 懂色av一区二区| 热久久精品国产| 亚洲免费在线观看视频| 国产福利电影在线| 999热视频在线观看| 天堂影院一区二区|