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

實戰篇:Security+JWT組合拳

開發 后端
Web應用的安全性包括用戶認證和用戶授權兩個部分,而Spring Security(以下簡稱Security)基于Spring框架,正好可以完整解決該問題。它的真正強大之處在于它可以輕松擴展以滿足自定義要求。

[[408789]]

Good morning, everyone!

之前我們已經說過用Shiro和JWT來實現身份認證和用戶授權,今天我們再來說一下「Security和JWT」的組合拳。

簡介

先贅述一下身份認證和用戶授權:

用戶認證(Authentication):系統通過校驗用戶提供的用戶名和密碼來驗證該用戶是否為系統中的合法主體,即是否可以訪問該系統;

用戶授權(Authorization):系統為用戶分配不同的角色,以獲取對應的權限,即驗證該用戶是否有權限執行該操作;

Web應用的安全性包括用戶認證和用戶授權兩個部分,而Spring Security(以下簡稱Security)基于Spring框架,正好可以完整解決該問題。

它的真正強大之處在于它可以輕松擴展以滿足自定義要求。

原理

Security可以看做是由一組filter過濾器鏈組成的權限認證。它的整個工作流程如下所示:

圖中綠色認證方式是可以配置的,橘黃色和藍色的位置不可更改:

  • FilterSecurityInterceptor:最后的過濾器,它會決定當前的請求可不可以訪問Controller
  • ExceptionTranslationFilter:異常過濾器,接收到異常消息時會引導用戶進行認證;

實戰

項目準備

我們使用Spring Boot框架來集成。

1.pom文件引入的依賴

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter</artifactId> 
  4. </dependency> 
  5.  
  6. <dependency> 
  7.     <groupId>org.springframework.boot</groupId> 
  8.     <artifactId>spring-boot-starter-web</artifactId> 
  9.     <exclusions> 
  10.         <exclusion> 
  11.             <groupId>org.springframework.boot</groupId> 
  12.             <artifactId>spring-boot-starter-tomcat</artifactId> 
  13.         </exclusion> 
  14.     </exclusions> 
  15. </dependency> 
  16.  
  17. <dependency> 
  18.     <groupId>org.springframework.boot</groupId> 
  19.     <artifactId>spring-boot-starter-undertow</artifactId> 
  20. </dependency> 
  21.  
  22. <dependency> 
  23.     <groupId>mysql</groupId> 
  24.     <artifactId>mysql-connector-java</artifactId> 
  25. </dependency> 
  26.  
  27. <dependency> 
  28.     <groupId>com.baomidou</groupId> 
  29.     <artifactId>mybatis-plus-boot-starter</artifactId> 
  30.     <version>3.4.0</version> 
  31. </dependency> 
  32.  
  33. <dependency> 
  34.     <groupId>org.projectlombok</groupId> 
  35.     <artifactId>lombok</artifactId> 
  36. </dependency> 
  37.  
  38. <!-- 阿里JSON解析器 --> 
  39. <dependency> 
  40.     <groupId>com.alibaba</groupId> 
  41.     <artifactId>fastjson</artifactId> 
  42.     <version>1.2.74</version> 
  43. </dependency> 
  44.  
  45. <dependency> 
  46.     <groupId>joda-time</groupId> 
  47.     <artifactId>joda-time</artifactId> 
  48.     <version>2.10.6</version> 
  49. </dependency> 
  50.  
  51. <dependency> 
  52.     <groupId>org.springframework.boot</groupId> 
  53.     <artifactId>spring-boot-starter-test</artifactId> 
  54. </dependency> 

 

2.application.yml配置

  1. spring: 
  2.   application: 
  3.     name: securityjwt 
  4.   datasource: 
  5.     driver-class-name: com.mysql.cj.jdbc.Driver 
  6.     url: jdbc:mysql://127.0.0.1:3306/cheetah?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC 
  7.     username: root 
  8.     password: 123456 
  9.  
  10. server: 
  11.   port: 8080 
  12.  
  13. mybatis: 
  14.   mapper-locations: classpath:mapper/*.xml 
  15.   type-aliases-package: com.itcheetah.securityjwt.entity 
  16.   configuration: 
  17.     map-underscore-to-camel-casetrue 
  18.  
  19. rsa: 
  20.   key
  21.     pubKeyFile: C:\Users\Desktop\jwt\id_key_rsa.pub 
  22.     priKeyFile: C:\Users\Desktop\jwt\id_key_rsa 

3.SQL文件

  1. /** 
  2. * sys_user_info 
  3. **/ 
  4.  
  5. SET NAMES utf8mb4; 
  6. SET FOREIGN_KEY_CHECKS = 0; 
  7.  
  8. -- ---------------------------- 
  9. -- Table structure for sys_user_info 
  10. -- ---------------------------- 
  11. DROP TABLE IF EXISTS `sys_user_info`; 
  12. CREATE TABLE `sys_user_info`  ( 
  13.   `id` bigint(20) NOT NULL AUTO_INCREMENT, 
  14.   `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
  15.   `passwordvarchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
  16.   PRIMARY KEY (`id`) USING BTREE 
  17. ) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic
  18.  
  19. SET FOREIGN_KEY_CHECKS = 1; 
  20.  
  21.  
  22. /** 
  23. * product_info 
  24. **/ 
  25.  
  26. SET NAMES utf8mb4; 
  27. SET FOREIGN_KEY_CHECKS = 0; 
  28.  
  29. -- ---------------------------- 
  30. -- Table structure for product_info 
  31. -- ---------------------------- 
  32. DROP TABLE IF EXISTS `product_info`; 
  33. CREATE TABLE `product_info`  ( 
  34.   `id` bigint(20) NOT NULL AUTO_INCREMENT, 
  35.   `namevarchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
  36.   `price` decimal(10, 4) NULL DEFAULT NULL
  37.   `create_date` datetime(0) NULL DEFAULT NULL
  38.   `update_date` datetime(0) NULL DEFAULT NULL
  39.   PRIMARY KEY (`id`) USING BTREE 
  40. ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic
  41.  
  42. SET FOREIGN_KEY_CHECKS = 1; 

引入依賴

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-security</artifactId> 
  4. </dependency> 
  5.  
  6. <!--Token生成與解析--> 
  7. <dependency> 
  8.     <groupId>io.jsonwebtoken</groupId> 
  9.     <artifactId>jjwt</artifactId> 
  10.     <version>0.9.1</version> 
  11. </dependency> 

 

引入之后啟動項目,會有如圖所示:

其中用戶名為user,密碼為上圖中的字符串。

SecurityConfig類

  1. //開啟全局方法安全性 
  2. @EnableGlobalMethodSecurity(prePostEnabled=true, securedEnabled=true
  3. public class SecurityConfig extends WebSecurityConfigurerAdapter { 
  4.  
  5.     //認證失敗處理類 
  6.     @Autowired 
  7.     private AuthenticationEntryPointImpl unauthorizedHandler; 
  8.  
  9.     //提供公鑰私鑰的配置類 
  10.     @Autowired 
  11.     private RsaKeyProperties prop; 
  12.  
  13.     @Autowired 
  14.     private UserInfoService userInfoService; 
  15.      
  16.     @Override 
  17.     protected void configure(HttpSecurity httpSecurity) throws Exception { 
  18.         httpSecurity 
  19.                 // CSRF禁用,因為不使用session 
  20.                 .csrf().disable() 
  21.                 // 認證失敗處理類 
  22.                 .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() 
  23.                 // 基于token,所以不需要session 
  24.                 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() 
  25.                 // 過濾請求 
  26.                 .authorizeRequests() 
  27.                 .antMatchers( 
  28.                         HttpMethod.GET, 
  29.                         "/*.html"
  30.                         "/**/*.html"
  31.                         "/**/*.css"
  32.                         "/**/*.js" 
  33.                 ).permitAll() 
  34.                 // 除上面外的所有請求全部需要鑒權認證 
  35.                 .anyRequest().authenticated() 
  36.                 .and() 
  37.                 .headers().frameOptions().disable(); 
  38.         // 添加JWT filter 
  39.         httpSecurity.addFilter(new TokenLoginFilter(super.authenticationManager(), prop)) 
  40.                 .addFilter(new TokenVerifyFilter(super.authenticationManager(), prop)); 
  41.     } 
  42.  
  43.     //指定認證對象的來源 
  44.     public void configure(AuthenticationManagerBuilder auth) throws Exception { 
  45.          
  46.         auth.userDetailsService(userInfoService) 
  47.         //從前端傳遞過來的密碼就會被加密,所以從數據庫 
  48.         //查詢到的密碼必須是經過加密的,而這個過程都是 
  49.         //在用戶注冊的時候進行加密的。 
  50.         .passwordEncoder(passwordEncoder()); 
  51.     } 
  52.  
  53.     //密碼加密 
  54.     @Bean 
  55.     public BCryptPasswordEncoder passwordEncoder(){ 
  56.         return new BCryptPasswordEncoder(); 
  57.     } 

「攔截規則」

  • anyRequest:匹配所有請求路徑
  • access:SpringEl表達式結果為true時可以訪問
  • anonymous:匿名可以訪問
  • `denyAll:用戶不能訪問
  • fullyAuthenticated:用戶完全認證可以訪問(非remember-me下自動登錄)
  • hasAnyAuthority:如果有參數,參數表示權限,則其中任何一個權限可以訪問
  • hasAnyRole:如果有參數,參數表示角色,則其中任何一個角色可以訪問
  • hasAuthority:如果有參數,參數表示權限,則其權限可以訪問
  • hasIpAddress:如果有參數,參數表示IP地址,如果用戶IP和參數匹配,則可以訪問
  • hasRole:如果有參數,參數表示角色,則其角色可以訪問
  • permitAll:用戶可以任意訪問
  • rememberMe:允許通過remember-me登錄的用戶訪問
  • authenticated:用戶登錄后可訪問

認證失敗處理類

  1. /** 
  2.  *  返回未授權 
  3.  */ 
  4. @Component 
  5. public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable { 
  6.  
  7.     private static final long serialVersionUID = -8970718410437077606L; 
  8.  
  9.     @Override 
  10.     public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) 
  11.             throws IOException { 
  12.         int code = HttpStatus.UNAUTHORIZED; 
  13.         String msg = "認證失敗,無法訪問系統資源,請先登陸"
  14.         ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(code, msg))); 
  15.     } 

認證流程

自定義認證過濾器

  1. public class TokenLoginFilter extends UsernamePasswordAuthenticationFilter { 
  2.  
  3.     private AuthenticationManager authenticationManager; 
  4.  
  5.     private RsaKeyProperties prop; 
  6.  
  7.     public TokenLoginFilter(AuthenticationManager authenticationManager, RsaKeyProperties prop) { 
  8.         this.authenticationManager = authenticationManager; 
  9.         this.prop = prop; 
  10.     } 
  11.  
  12.     /** 
  13.      * @author cheetah 
  14.      * @description 登陸驗證 
  15.      * @date 2021/6/28 16:17 
  16.      * @Param [request, response] 
  17.      * @return org.springframework.security.core.Authentication 
  18.      **/ 
  19.     public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { 
  20.         try { 
  21.             UserPojo sysUser = new ObjectMapper().readValue(request.getInputStream(), UserPojo.class); 
  22.             UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(sysUser.getUsername(), sysUser.getPassword()); 
  23.             return authenticationManager.authenticate(authRequest); 
  24.         }catch (Exception e){ 
  25.             try { 
  26.                 response.setContentType("application/json;charset=utf-8"); 
  27.                 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
  28.                 PrintWriter out = response.getWriter(); 
  29.                 Map resultMap = new HashMap(); 
  30.                 resultMap.put("code", HttpServletResponse.SC_UNAUTHORIZED); 
  31.                 resultMap.put("msg""用戶名或密碼錯誤!"); 
  32.                 out.write(new ObjectMapper().writeValueAsString(resultMap)); 
  33.                 out.flush(); 
  34.                 out.close(); 
  35.             }catch (Exception outEx){ 
  36.                 outEx.printStackTrace(); 
  37.             } 
  38.             throw new RuntimeException(e); 
  39.         } 
  40.     } 
  41.  
  42.  
  43.     /** 
  44.      * @author cheetah 
  45.      * @description 登陸成功回調 
  46.      * @date 2021/6/28 16:17 
  47.      * @Param [request, response, chain, authResult] 
  48.      * @return void 
  49.      **/ 
  50.     public void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { 
  51.         UserPojo user = new UserPojo(); 
  52.         user.setUsername(authResult.getName()); 
  53.         user.setRoles((List<RolePojo>)authResult.getAuthorities()); 
  54.         //通過私鑰進行加密:token有效期一天 
  55.         String token = JwtUtils.generateTokenExpireInMinutes(user, prop.getPrivateKey(), 24 * 60); 
  56.         response.addHeader("Authorization""Bearer "+token); 
  57.         try { 
  58.             response.setContentType("application/json;charset=utf-8"); 
  59.             response.setStatus(HttpServletResponse.SC_OK); 
  60.             PrintWriter out = response.getWriter(); 
  61.             Map resultMap = new HashMap(); 
  62.             resultMap.put("code", HttpServletResponse.SC_OK); 
  63.             resultMap.put("msg""認證通過!"); 
  64.             resultMap.put("token", token); 
  65.             out.write(new ObjectMapper().writeValueAsString(resultMap)); 
  66.             out.flush(); 
  67.             out.close(); 
  68.         }catch (Exception outEx){ 
  69.             outEx.printStackTrace(); 
  70.         } 
  71.     } 

流程

Security默認登錄路徑為/login,當我們調用該接口時,它會調用上邊的attemptAuthentication方法;圖片圖片圖片圖片所以我們要自定義UserInfoService繼承UserDetailsService實現loadUserByUsername方法;

所以我們要自定義UserInfoService繼承UserDetailsService實現loadUserByUsername方法;

  1. public interface UserInfoService extends UserDetailsService { 
  2.  
  3.  
  4. @Service 
  5. @Transactional 
  6. public class UserInfoServiceImpl implements UserInfoService { 
  7.  
  8.     @Autowired 
  9.     private SysUserInfoMapper userInfoMapper; 
  10.  
  11.     @Override 
  12.     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
  13.         UserPojo user = userInfoMapper.queryByUserName(username); 
  14.         return user
  15.     } 

其中的loadUserByUsername返回的是UserDetails類型,所以UserPojo繼承UserDetails類

  1. @Data 
  2. public class UserPojo implements UserDetails { 
  3.  
  4.     private Integer id; 
  5.  
  6.     private String username; 
  7.  
  8.     private String password
  9.  
  10.     private Integer status; 
  11.  
  12.     private List<RolePojo> roles; 
  13.  
  14.     @JsonIgnore 
  15.     @Override 
  16.     public Collection<? extends GrantedAuthority> getAuthorities() { 
  17.         //理想型返回 admin 權限,可自已處理這塊 
  18.         List<SimpleGrantedAuthority> auth = new ArrayList<>(); 
  19.         auth.add(new SimpleGrantedAuthority("ADMIN")); 
  20.         return auth; 
  21.     } 
  22.  
  23.     @Override 
  24.     public String getPassword() { 
  25.         return this.password
  26.     } 
  27.  
  28.     @Override 
  29.     public String getUsername() { 
  30.         return this.username; 
  31.     } 
  32.  
  33.     /** 
  34.      * 賬戶是否過期 
  35.      **/ 
  36.     @JsonIgnore 
  37.     @Override 
  38.     public boolean isAccountNonExpired() { 
  39.         return true
  40.     } 
  41.  
  42.     /** 
  43.      * 是否禁用 
  44.      */ 
  45.     @JsonIgnore 
  46.     @Override 
  47.     public boolean isAccountNonLocked() { 
  48.         return true
  49.     } 
  50.  
  51.     /** 
  52.      * 密碼是否過期 
  53.      */ 
  54.     @JsonIgnore 
  55.     @Override 
  56.     public boolean isCredentialsNonExpired() { 
  57.         return true
  58.     } 
  59.  
  60.     /** 
  61.      * 是否啟用 
  62.      */ 
  63.     @JsonIgnore 
  64.     @Override 
  65.     public boolean isEnabled() { 
  66.         return true
  67.     } 

當認證通過之后會在SecurityContext中設置Authentication對象,回調調用successfulAuthentication方法返回token信息,

整體流程圖如下

鑒權流程

自定義token過濾器

  1. public class TokenVerifyFilter extends BasicAuthenticationFilter { 
  2.     private RsaKeyProperties prop; 
  3.  
  4.     public TokenVerifyFilter(AuthenticationManager authenticationManager, RsaKeyProperties prop) { 
  5.         super(authenticationManager); 
  6.         this.prop = prop; 
  7.     } 
  8.  
  9.     public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { 
  10.         String header = request.getHeader("Authorization"); 
  11.         if (header == null || !header.startsWith("Bearer ")) { 
  12.             //如果攜帶錯誤的token,則給用戶提示請登錄! 
  13.             chain.doFilter(request, response); 
  14.         } else { 
  15.             //如果攜帶了正確格式的token要先得到token 
  16.             String token = header.replace("Bearer """); 
  17.             //通過公鑰進行解密:驗證tken是否正確 
  18.             Payload<UserPojo> payload = JwtUtils.getInfoFromToken(token, prop.getPublicKey(), UserPojo.class); 
  19.             UserPojo user = payload.getUserInfo(); 
  20.             if(user!=null){ 
  21.                 UsernamePasswordAuthenticationToken authResult = new UsernamePasswordAuthenticationToken(user.getUsername(), nulluser.getAuthorities()); 
  22.                 //將認證信息存到安全上下文中 
  23.                 SecurityContextHolder.getContext().setAuthentication(authResult); 
  24.                 chain.doFilter(request, response); 
  25.             } 
  26.         } 
  27.     } 

當我們訪問時需要在header中攜帶token信息

本文轉載自微信公眾號「阿Q說代碼」,可以通過以下二維碼關注。轉載本文請聯系阿Q說代碼公眾號。

 

責任編輯:武曉燕 來源: 阿Q說代碼
相關推薦

2019-05-21 14:33:01

2009-06-15 16:05:30

設計AnnotatioJava

2017-11-08 13:31:34

分層架構代碼DDD

2021-07-05 08:41:49

RedisGEO系統

2011-10-31 09:26:07

惠普轉型云計算

2014-07-06 14:05:22

IBMWebSphere數字經濟

2021-04-29 09:40:32

測試IDEAirtest

2018-05-08 18:26:49

數據庫MySQL性能

2011-09-26 11:28:51

信息防泄漏溢信科技

2015-10-20 19:08:28

華三通信

2011-09-18 14:27:58

2021-09-08 09:48:39

數據庫工具技術

2016-12-09 13:45:21

RNN大數據深度學習

2010-11-09 10:03:26

2016-08-31 09:19:57

2025-07-15 10:06:54

2023-02-23 10:03:57

2025-04-28 02:22:00

2021-09-09 08:55:50

Python項目驗證碼

2021-07-06 08:41:54

RedisGeo 類型數據類型
點贊
收藏

51CTO技術棧公眾號

yourporn在线观看视频| 久久久久亚洲视频| 久久93精品国产91久久综合| 欧美在线观看视频一区二区| 一级黄色录像免费看| 国产小视频免费观看| 天堂午夜影视日韩欧美一区二区| 在线免费看av不卡| 四虎永久免费观看| 欧美另类激情| 欧美性猛交xxxx富婆| 五月天色婷婷综合| 每日更新av在线播放| 国产在线一区二区综合免费视频| 668精品在线视频| 国产成人免费在线观看视频| 噜噜噜狠狠夜夜躁精品仙踪林| 欧美亚洲国产怡红院影院| 少妇一晚三次一区二区三区| 高清国产福利在线观看| 不卡的av在线| 亚洲在线观看视频| 欧美一级做a爰片免费视频| 亚洲欧洲日本mm| 久久精品人人做人人爽| 国产熟妇搡bbbb搡bbbb| 99精品国产一区二区三区2021| 欧美天堂亚洲电影院在线播放| 中文字幕无码精品亚洲资源网久久| 丝袜美腿美女被狂躁在线观看| 91蝌蚪porny九色| 成人国产1314www色视频| 伊人成人在线观看| 玖玖视频精品| 日本久久久久久久久| 国产真实夫妇交换视频| 一个色综合网| 色黄久久久久久| 免费看黄色三级| 女人丝袜激情亚洲| 日韩成人黄色av| yjizz视频| 99re热精品视频| 精品人在线二区三区| 色姑娘综合天天| 国产95亚洲| 欧美日韩mp4| 日韩av手机版| 欧美少妇激情| 欧美欧美欧美欧美首页| 免费成人黄色大片| 亚洲国产91视频| 欧美日韩一区 二区 三区 久久精品 | 国产第一页视频| 在线观看特色大片免费视频| 午夜电影网一区| 欧美牲交a欧美牲交| 极品在线视频| 色婷婷综合久色| 男人舔女人下面高潮视频| 另类专区亚洲| 欧美私人免费视频| www欧美激情| 99久久99九九99九九九| 6080国产精品一区二区| japan高清日本乱xxxxx| 狠狠一区二区三区| 日韩成人xxxx| 手机看片日韩av| 欧美激情成人| 高清视频欧美一级| 在线能看的av| 蜜臀精品久久久久久蜜臀| 国产伦精品免费视频| 国产女人18毛片18精品| www.欧美日韩国产在线| 欧美日韩在线播放一区二区| 91网页在线观看| 亚洲免费伊人电影| 水蜜桃色314在线观看| 怡红院成人在线| 在线成人av网站| 中文字幕人妻熟女在线| 亚洲+变态+欧美+另类+精品| 一区二区三区四区精品| 日韩女优一区二区| 国产精品毛片在线看| 国产精品久久久久久亚洲调教| 国产一区二区在线播放视频| 国产成人在线观看| 欧美激情国产日韩| 国产成人午夜| 日本精品一区二区三区高清 | 韩国三级大全久久网站| 亚洲二区中文字幕| 日本在线观看网址| 在线成人www免费观看视频| 国产成+人+综合+亚洲欧美丁香花| 91av久久久| aaa欧美色吧激情视频| 日本黑人久久| 国模雨婷捆绑高清在线| 欧美性猛交xxxx乱大交退制版| 在线观看免费看片| 国产一区二区三区网| 久久99久国产精品黄毛片入口| 69亚洲精品久久久蜜桃小说| 激情综合色综合久久| 久久婷婷人人澡人人喊人人爽| 欧美a免费在线| 欧美日韩亚洲一区二区| 无套内谢丰满少妇中文字幕 | 成人噜噜噜噜| 亚洲欧美综合另类中字| 国产亚洲成人精品| 久久电影网站中文字幕| 免费影院在线观看一区| 手机av免费在线| 欧美日韩一区二区欧美激情| 97超碰在线免费观看| 欧美三级视频| 91免费综合在线| 第三区美女视频在线| 天涯成人国产亚洲精品一区av| 亚洲免费成人在线视频| 成人写真视频| 欧亚精品在线观看| 天天综合永久入口| 亚洲香肠在线观看| 深爱五月综合网| 97久久视频| 国产精品日韩在线一区| 久久这里精品| 色综合天天综合色综合av| 少妇被狂c下部羞羞漫画| 欧美韩国一区| 91视频免费进入| 成人av免费| 欧美一区二区三区公司| 韩国一级黄色录像| 久久成人免费网站| 亚洲综合欧美日韩| 色天使综合视频| 亚洲人成在线观看网站高清| 国产69精品久久久久久久久久| 粉嫩一区二区三区性色av| 青青青在线观看视频| julia中文字幕一区二区99在线| 欧美成人精品一区二区三区| av 一区二区三区| 亚洲欧美一区二区三区国产精品| 日本一二区免费| 亚洲成人精品| 亚洲自拍偷拍色图| 中文字幕在线三区| 精品国产一区久久| 国产午夜免费视频| 99久久伊人精品| 日韩欧美精品在线观看视频| 国产精品一区二区av交换| 国产精品扒开腿爽爽爽视频 | 中文字幕中文字幕一区| 久热在线视频观看| 中文字幕免费一区二区三区| **亚洲第一综合导航网站| 亚洲男同gay网站| 亚洲精品720p| 国产精品免费无遮挡无码永久视频| 久久久电影一区二区三区| 欧美一级裸体视频| 亚洲女同另类| 国产一区二区三区四区hd| 免费看av不卡| 亚洲最新av在线| 国产欧美日韩综合精品一区二区三区| 亚洲欧美另类久久久精品2019| 国产av一区二区三区传媒| 石原莉奈在线亚洲二区| 熟妇熟女乱妇乱女网站| 国产一区二区在线视频你懂的| 欧美在线一区二区三区四| www.国产精品.com| 日韩精品一区二区三区蜜臀| 偷偷操不一样的久久| 国产精品青草久久| 精品人妻伦一二三区久| 日韩中文字幕91| 欧美日韩dvd| 国产成人3p视频免费观看| 国产日韩在线看片| 黄色激情在线播放| 久久激情视频免费观看| 天堂中文网在线| 欧美日韩国产美| 在线观看免费国产视频| 国产精品久久久久久亚洲毛片| 女同性αv亚洲女同志| 老司机午夜免费精品视频| 国产制服91一区二区三区制服| 亚洲免费毛片| 97人人模人人爽视频一区二区| 吞精囗交69激情欧美| 久操成人在线视频| av资源种子在线观看| 亚洲国产精彩中文乱码av在线播放| 欧美视频xxxx| 亚洲成人免费在线| 日韩成人短视频| 久久久久久97三级| 亚洲精品乱码久久久久久蜜桃图片| 免费观看30秒视频久久| 丰满少妇被猛烈进入高清播放| 欧美啪啪一区| 一级日韩一区在线观看| 久久超碰99| 精品一区二区三区国产| 精品三级国产| 国产一区二区在线播放| 少妇精品视频一区二区免费看| 午夜精品在线观看| 欧美一卡二卡| 久久久国产成人精品| 国产大片在线免费观看| 亚洲国产精品小视频| 北条麻妃一二三区| 3d动漫精品啪啪1区2区免费 | 久久精品国产网站| 欧美精品aaaa| 久久精品中文| 国产成人精品视频免费看| 亚洲性人人天天夜夜摸| 热久久最新地址| **女人18毛片一区二区| 尤物国产精品| 亚洲成av人片乱码色午夜| 一区二区三区av在线| 日本精品黄色| 视频一区视频二区视频三区视频四区国产 | 亚洲免费精彩视频| 少妇高潮一区二区三区69| 精品国产乱码久久久久久蜜臀| 国产黄色大片网站| 欧美一卡二卡三卡四卡| 99视频在线观看免费| 日韩一区二区在线播放| 亚洲国产av一区二区| 精品国产精品一区二区夜夜嗨| www国产一区| 精品国产伦一区二区三区观看体验| 亚洲乱熟女一区二区| 亚洲国产成人精品久久| 日韩电影免费| 一区二区三区视频免费在线观看| 成人在线免费观看| 日韩亚洲精品视频| 羞羞污视频在线观看| 欧美精品aaa| 韩国精品一区| 国产成人97精品免费看片| 播放一区二区| 国产中文字幕日韩| 日韩中文字幕无砖| 精品视频在线观看| 成人综合一区| 一区二区不卡在线观看| 欧美日韩国产欧| 黄色免费福利视频| 免费在线观看不卡| 色婷婷一区二区三区在线观看| 国产高清精品久久久久| 51调教丨国产调教视频| 国产欧美一区二区三区网站| 午夜剧场免费在线观看| 亚洲综合色噜噜狠狠| 五月天激情国产综合婷婷婷| 欧美日本在线观看| 丰满大乳国产精品| 亚洲图中文字幕| av网站在线看| 欧洲日本亚洲国产区| 日韩亚洲国产免费| 韩日午夜在线资源一区二区| 国产一区二区三区四区二区| 91九色国产ts另类人妖| 一本色道久久综合亚洲精品高清| 久草综合在线观看| 国产一区二区在线免费观看| 免费的av网站| 综合久久一区二区三区| 五月婷婷中文字幕| 欧美伦理视频网站| 天堂影院在线| 久久久99免费视频| 三上悠亚亚洲一区| 99影视tv| 日本激情一区| 少妇性饥渴无码a区免费| 国产一区二区伦理| 精品人伦一区二区| 亚洲国产日韩精品| 亚洲视频在线免费播放| 日韩h在线观看| 伊人影院在线视频| 国产精品一区二区久久精品| 偷拍亚洲色图| 美女黄色免费看| 六月丁香婷婷久久| 一区二区三区四区免费| 亚洲午夜三级在线| 国产欧美一区二区三区视频在线观看| 亚洲免费伊人电影在线观看av| 永久免费网站在线| 成人性生交大片免费看小说| 精品国产一区二区三区小蝌蚪 | 性欧美疯狂猛交69hd| 色综合激情久久| 姝姝窝人体www聚色窝| 九九久久久久久久久激情| 福利一区和二区| 欧洲一区二区在线| 国产农村妇女毛片精品久久莱园子 | 人人玩人人添人人澡欧美| 奇米精品在线| 久久福利影视| 三级黄色片网站| 亚洲va天堂va国产va久| 亚洲av综合色区无码一区爱av| 久久香蕉国产线看观看网| 成人在线视频观看| 日韩福利视频| 日韩二区在线观看| 国产人妻大战黑人20p| 欧美日韩国产限制| 午夜影院免费体验区| 欧美精品videosex牲欧美| 九九99久久精品在免费线bt| 国产卡一卡二在线| 狠狠色伊人亚洲综合成人| 天天爽天天爽天天爽| 欧美日韩精品一区视频| 在线观看av的网站| 成人黄色av网| 在线一区电影| 91传媒理伦片在线观看| 五月婷婷久久综合| 污视频网站在线播放| 91高清视频免费| 国产91精品对白在线播放| 97视频在线免费播放| 国产清纯美女被跳蛋高潮一区二区久久w | 国产在线观看a| 91亚洲精品视频| 欧美fxxxxxx另类| 中文字幕三级电影| 欧美性极品xxxx娇小| 国产在线播放av| 国产日韩欧美一二三区| 亚洲精品网址| 日批免费观看视频| 欧美日韩激情美女| 在线免费av网站| 91在线网站视频| 在线观看视频免费一区二区三区| 黑人玩弄人妻一区二区三区| 疯狂蹂躏欧美一区二区精品| 久久久久国产精品嫩草影院| 国产美女精彩久久| 91精品啪在线观看国产18| 国产高潮视频在线观看| 色94色欧美sute亚洲线路一久| 男人和女人做事情在线视频网站免费观看| 成人黄色激情网| 亚洲青涩在线| 夫妇交换中文字幕| 欧美成人性战久久| av综合电影网站| 在线日韩av永久免费观看| 成人夜色视频网站在线观看| 日韩精品久久久久久免费| 日韩在线观看免费高清| 国产精品对白| 日本三级黄色网址| 亚洲成人免费视| 91这里只有精品| 国产伦精品一区二区三区照片91| 丝袜美腿亚洲一区二区图片| 私库av在线播放| 亚洲人成电影网站色…| 久久久91麻豆精品国产一区| 亚洲熟女乱色一区二区三区| 中文字幕亚洲不卡| 亚洲 欧美 精品| 亚洲专区在线视频| 三级欧美在线一区| 久久在线视频精品| 国产一区二区三区视频免费| 北条麻妃在线一区二区免费播放| 香港日本韩国三级网站| 午夜亚洲福利老司机| 岛国成人毛片|